Merge pull request #551 from jack-pappas/sgen-patch
[mono.git] / mono / utils / lock-free-alloc.c
index 4c95990ddee397a9d853ed086f97ee8e5e2d086e..916a1aac0886a4e0f17c18a82c2bc8dcba4edb95 100644 (file)
@@ -111,14 +111,14 @@ typedef struct _MonoLockFreeAllocDescriptor Descriptor;
 struct _MonoLockFreeAllocDescriptor {
        MonoLockFreeQueueNode node;
        MonoLockFreeAllocator *heap;
-       Anchor anchor;
+       volatile Anchor anchor;
        unsigned int slot_size;
        unsigned int max_count;
        gpointer sb;
 #ifndef DESC_AVAIL_DUMMY
-       Descriptor *next;
+       Descriptor * volatile next;
 #endif
-       gboolean in_use;
+       gboolean in_use;        /* used for debugging only */
 };
 
 #define NUM_DESC_BATCH 64
@@ -252,7 +252,7 @@ desc_retire (Descriptor *desc)
        g_assert (desc->in_use);
        desc->in_use = FALSE;
        free_sb (desc->sb);
-       mono_thread_hazardous_free_or_queue (desc, desc_enqueue_avail);
+       mono_thread_hazardous_free_or_queue (desc, desc_enqueue_avail, FALSE, TRUE);
 }
 #else
 MonoLockFreeQueue available_descs;
@@ -304,7 +304,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);
+       mono_thread_hazardous_free_or_queue (desc, desc_put_partial, FALSE, TRUE);
 }
 
 static void
@@ -323,7 +323,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);
+                       mono_thread_hazardous_free_or_queue (desc, desc_put_partial, FALSE, TRUE);
                        if (++num_non_empty >= 2)
                                return;
                }