0
|
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 }
|