Mercurial > hg > Papers > 2017 > mitsuki-sigos
comparison paper/src/sync_enqueue.c @ 1:59cb9d3f9a55
add
author | mir3636 |
---|---|
date | Fri, 14 Apr 2017 23:30:08 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:581d76326ace | 1:59cb9d3f9a55 |
---|---|
1 // Enqueue(normal) | |
2 __code putQueue3(struct Context* context, struct Queue* queue, struct Element* new_element) { | |
3 struct Element* last = queue->last; | |
4 | |
5 if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) { | |
6 last->next = new_element; | |
7 queue->count++; | |
8 | |
9 goto meta(context, context->next); | |
10 } else { | |
11 goto meta(context, PutQueue3); | |
12 } | |
13 } | |
14 | |
15 // Enqueue(nothing element) | |
16 __code putQueue4(struct Context* context, struct Queue* queue, struct Element* new_element) { | |
17 if (__sync_bool_compare_and_swap(&queue->first, 0, new_element)) { | |
18 queue->last = new_element; | |
19 queue->count++; | |
20 | |
21 goto meta(context, context->next); | |
22 } else { | |
23 goto meta(context, PutQueue3); | |
24 } | |
25 } |