Small improvements to the concurrent queue.
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 25 May 2012 13:50:20 +0000 (10:50 -0300)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 25 May 2012 14:23:09 +0000 (11:23 -0300)
* mono-cq.c (mono_cq_add_node): Add a store store fence
between the two stores as they can be observed OOO.

* mono-cq.c (mono_cq_create): Use precise roots for head
and tail.

mono/metadata/mono-cq.c

index 790af7d4cb1e8702e9e6d18f3170d53643f5f152..01be2ef71f21fb348c8d664a0aecc1e0f0952070 100644 (file)
@@ -66,8 +66,8 @@ mono_cq_create ()
        MonoCQ *cq;
 
        cq = g_new0 (MonoCQ, 1);
-       MONO_GC_REGISTER_ROOT (cq->head);
-       MONO_GC_REGISTER_ROOT (cq->tail);
+       MONO_GC_REGISTER_ROOT_SINGLE (cq->head);
+       MONO_GC_REGISTER_ROOT_SINGLE (cq->tail);
        cq->head = mono_mlist_alloc ((MonoObject *) mono_cqitem_alloc ());
        cq->tail = cq->head;
        CQ_DEBUG ("Created %p", cq);
@@ -107,6 +107,10 @@ mono_cq_add_node (MonoCQ *cq)
        n = mono_mlist_alloc ((MonoObject *) mono_cqitem_alloc ());
        prev_tail = cq->tail;
        MONO_OBJECT_SETREF (prev_tail, next, n);
+
+       /* prev_tail->next must be visible before the new tail is */
+       STORE_STORE_FENCE;
+
        cq->tail = n;
 }