diff src/parallel_execution/SynchronizedQueue.cbc @ 282:a3448b0f0a56

Add input data gear
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Sun, 05 Feb 2017 04:08:30 +0900
parents 2c2e4e597eb0
children 6b099d73949c
line wrap: on
line diff
--- a/src/parallel_execution/SynchronizedQueue.cbc	Fri Feb 03 18:19:24 2017 +0900
+++ b/src/parallel_execution/SynchronizedQueue.cbc	Sun Feb 05 04:08:30 2017 +0900
@@ -4,10 +4,10 @@
 
 Queue* createSynchronizedQueue(struct Context* context) {
     struct Queue* queue = new Queue();
-    struct SingleLinkedQueue* singleLinkedQueue = new SingleLinkedQueue();
-    queue->queue = (union Data*)singleLinkedQueue;
-    singleLinkedQueue->top  = NULL;
-    singleLinkedQueue->last = NULL;
+    struct SynchronizedQueue* synchronizedQueue = new SynchronizedQueue();
+    synchronizedQueue->top  = NULL;
+    synchronizedQueue->last = NULL;
+    queue->queue = (union Data*)synchronizedQueue;
     queue->take  = C_takeSynchronizedQueue;
     queue->put  = C_putSynchronizedQueue;
     queue->isEmpty = C_isEmptySynchronizedQueue;
@@ -15,7 +15,7 @@
     return queue;
 }
 
-__code clearSynchronizedQueue(struct SingleLinkedQueue* queue, __code next(...)) {
+__code clearSynchronizedQueue(struct SynchronizedQueue* queue, __code next(...)) {
     struct Element* top = queue->top;
     if (__sync_bool_compare_and_swap(&queue->top, top, NULL)) {
         goto next(...);
@@ -24,10 +24,11 @@
     }
 }
 
-__code putSynchronizedQueue(struct SingleLinkedQueue* queue, struct Element* element, union Data* data, __code next(...)) {
+__code putSynchronizedQueue(struct SynchronizedQueue* queue, union Data* data, __code next(...)) {
+    Element* element = new Element();
     element->next = NULL;
     element->data = data;
-    if (queue->last) {
+    if (queue->top) {
         Element* last = queue->last;
         if (__sync_bool_compare_and_swap(&queue->last, last, element)) {
             last->next = element;
@@ -44,7 +45,7 @@
     goto next(...);
 }
 
-__code takeSynchronizedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) {
+__code takeSynchronizedQueue(struct SynchronizedQueue* queue, __code next(union Data* data, ...)) {
     if (queue->top) {
         struct Element* top = queue->top;
         if (__sync_bool_compare_and_swap(&queue->top, top, top->next)) {
@@ -53,12 +54,12 @@
             goto meta(context, C_takeSynchronizedQueue);
         }
     } else {
-        data = NULL;
+        goto meta(context, C_takeSynchronizedQueue);
     }
     goto next(data, ...);
 }
 
-__code isEmptySynchronizedQueue(struct SingleLinkedQueue* queue, __code next(...), __code whenEmpty(...)) {
+__code isEmptySynchronizedQueue(struct SynchronizedQueue* queue, __code next(...), __code whenEmpty(...)) {
     if (queue->top)
         goto next(...);
     else