Mercurial > hg > Gears > GearsAgda
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