Mercurial > hg > Papers > 2018 > ryokka-sigos
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); + } +}