diff Paper/src/sync_enqueue.c @ 0:a5facba1adbc

first
author ryokka
date Fri, 13 Apr 2018 18:07:04 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/sync_enqueue.c	Fri Apr 13 18:07:04 2018 +0900
@@ -0,0 +1,25 @@
+// Enqueue(normal)
+__code putQueue3(struct Context* context, struct Queue* queue, struct Element* new_element) {
+    struct Element* last = queue->last;
+
+    if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) {
+        last->next = new_element;
+        queue->count++;
+        
+        goto meta(context, context->next);
+    } else {
+        goto meta(context, PutQueue3);
+    }
+}
+
+// Enqueue(nothing element)
+__code putQueue4(struct Context* context, struct Queue* queue, struct Element* new_element) {
+    if (__sync_bool_compare_and_swap(&queue->first, 0, new_element)) {
+        queue->last = new_element;
+        queue->count++;
+        
+        goto meta(context, context->next);
+    } else {
+        goto meta(context, PutQueue3);
+    }
+}