Merge pull request #1943 from alexrp/profiler-improvements
[mono.git] / mono / utils / lock-free-queue.c
index e50bcfc2eef9ee1e4758139cad46cf27b05fe963..99cc8aaaf1622607d854923ca80a87e71218b663 100644 (file)
  */
 
 #include <stdlib.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#include <sys/mman.h>
+#endif
 
 #include <mono/utils/mono-membar.h>
 #include <mono/utils/hazard-pointer.h>
-#include <mono/io-layer/atomic.h>
+#include <mono/utils/atomic.h>
 
 #include <mono/utils/lock-free-queue.h>
 
-#define INVALID_NEXT   ((void*)-1)
-#define END_MARKER     ((void*)-2)
-#define FREE_NEXT      ((void*)-3)
+#define INVALID_NEXT   ((MonoLockFreeQueueNode *volatile)-1)
+#define END_MARKER     ((MonoLockFreeQueueNode *volatile)-2)
+#define FREE_NEXT      ((MonoLockFreeQueueNode *volatile)-3)
 
 void
 mono_lock_free_queue_init (MonoLockFreeQueue *q)
@@ -112,7 +113,7 @@ mono_lock_free_queue_enqueue (MonoLockFreeQueue *q, MonoLockFreeQueueNode *node)
        for (;;) {
                MonoLockFreeQueueNode *next;
 
-               tail = get_hazardous_pointer ((gpointer volatile*)&q->tail, hp, 0);
+               tail = (MonoLockFreeQueueNode *) get_hazardous_pointer ((gpointer volatile*)&q->tail, hp, 0);
                mono_memory_read_barrier ();
                /*
                 * We never dereference next so we don't need a
@@ -156,7 +157,7 @@ mono_lock_free_queue_enqueue (MonoLockFreeQueue *q, MonoLockFreeQueueNode *node)
 static void
 free_dummy (gpointer _dummy)
 {
-       MonoLockFreeQueueDummy *dummy = _dummy;
+       MonoLockFreeQueueDummy *dummy = (MonoLockFreeQueueDummy *) _dummy;
        mono_lock_free_queue_node_free (&dummy->node);
        g_assert (dummy->in_use);
        mono_memory_write_barrier ();
@@ -217,7 +218,7 @@ mono_lock_free_queue_dequeue (MonoLockFreeQueue *q)
        for (;;) {
                MonoLockFreeQueueNode *tail, *next;
 
-               head = get_hazardous_pointer ((gpointer volatile*)&q->head, hp, 0);
+               head = (MonoLockFreeQueueNode *) get_hazardous_pointer ((gpointer volatile*)&q->head, hp, 0);
                tail = (MonoLockFreeQueueNode*)q->tail;
                mono_memory_read_barrier ();
                next = head->next;
@@ -285,7 +286,7 @@ mono_lock_free_queue_dequeue (MonoLockFreeQueue *q)
                g_assert (q->has_dummy);
                q->has_dummy = 0;
                mono_memory_write_barrier ();
-               mono_thread_hazardous_free_or_queue (head, free_dummy);
+               mono_thread_hazardous_free_or_queue (head, free_dummy, FALSE, TRUE);
                if (try_reenqueue_dummy (q))
                        goto retry;
                return NULL;