X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Flock-free-alloc.c;h=66cb6ea3f8075fc44c9e6793c6bb86b5a7350844;hb=22a512306a3e8de71c75667dadf2fcd83efe3668;hp=5bf43ce877e1ebdf8aac34358827bf920aff0f32;hpb=3fa9d4d5c920ef4c67a99240d6f23bb1340159b5;p=mono.git diff --git a/mono/utils/lock-free-alloc.c b/mono/utils/lock-free-alloc.c index 5bf43ce877e..66cb6ea3f80 100644 --- a/mono/utils/lock-free-alloc.c +++ b/mono/utils/lock-free-alloc.c @@ -83,7 +83,12 @@ #include #include +#ifdef SGEN_WITHOUT_MONO +#include +#include +#else #include +#endif #include #include #include @@ -150,7 +155,7 @@ alloc_sb (Descriptor *desc) pagesize = mono_pagesize (); sb_header = desc->block_size == pagesize ? - mono_valloc (0, desc->block_size, prot_flags_for_activate (TRUE)) : + mono_valloc (NULL, desc->block_size, prot_flags_for_activate (TRUE)) : mono_valloc_aligned (desc->block_size, desc->block_size, prot_flags_for_activate (TRUE)); g_assert (sb_header == sb_header_for_addr (sb_header, desc->block_size)); @@ -191,7 +196,7 @@ desc_alloc (void) Descriptor *d; int i; - desc = (Descriptor *) mono_valloc (0, desc_size * NUM_DESC_BATCH, prot_flags_for_activate (TRUE)); + desc = (Descriptor *) mono_valloc (NULL, desc_size * NUM_DESC_BATCH, prot_flags_for_activate (TRUE)); /* Organize into linked list. */ d = desc; @@ -245,7 +250,7 @@ desc_retire (Descriptor *desc) g_assert (desc->in_use); desc->in_use = FALSE; free_sb (desc->sb, desc->block_size); - mono_thread_hazardous_free_or_queue (desc, desc_enqueue_avail, FALSE, TRUE); + mono_thread_hazardous_free_or_queue (desc, desc_enqueue_avail, HAZARD_FREE_NO_LOCK, HAZARD_FREE_ASYNC_CTX); } #else MonoLockFreeQueue available_descs; @@ -297,7 +302,7 @@ static void list_put_partial (Descriptor *desc) { g_assert (desc->anchor.data.state != STATE_FULL); - mono_thread_hazardous_free_or_queue (desc, desc_put_partial, FALSE, TRUE); + mono_thread_hazardous_free_or_queue (desc, desc_put_partial, HAZARD_FREE_NO_LOCK, HAZARD_FREE_ASYNC_CTX); } static void @@ -316,7 +321,7 @@ list_remove_empty_desc (MonoLockFreeAllocSizeClass *sc) desc_retire (desc); } else { g_assert (desc->heap->sc == sc); - mono_thread_hazardous_free_or_queue (desc, desc_put_partial, FALSE, TRUE); + mono_thread_hazardous_free_or_queue (desc, desc_put_partial, HAZARD_FREE_NO_LOCK, HAZARD_FREE_ASYNC_CTX); if (++num_non_empty >= 2) return; } @@ -366,10 +371,7 @@ alloc_from_active_or_partial (MonoLockFreeAllocator *heap) do { unsigned int next; - volatile Anchor* value; - value = (volatile Anchor *)&desc->anchor.value; - old_anchor = *(Anchor *)value; - new_anchor = old_anchor; + new_anchor = old_anchor = *(volatile Anchor*)&desc->anchor.value; if (old_anchor.data.state == STATE_EMPTY) { /* We must free it because we own it. */ desc_retire (desc); @@ -474,10 +476,7 @@ mono_lock_free_free (gpointer ptr, size_t block_size) sb = desc->sb; do { - volatile Anchor* value; - value = (volatile Anchor *)&desc->anchor.value; - old_anchor = *(Anchor *)value; - new_anchor = old_anchor; + new_anchor = old_anchor = *(volatile Anchor*)&desc->anchor.value; *(unsigned int*)ptr = old_anchor.data.avail; new_anchor.data.avail = ((char*)ptr - (char*)sb) / desc->slot_size; g_assert (new_anchor.data.avail < LOCK_FREE_ALLOC_SB_USABLE_SIZE (block_size) / desc->slot_size);