Mercurial > hg > Members > innparusu > Gears
comparison src/parallel_execution/worker.c @ 95:3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 29 Jan 2016 05:36:52 +0900 |
parents | |
children | d400948dbbab |
comparison
equal
deleted
inserted
replaced
92:851da1107223 | 95:3e28ee215c0e |
---|---|
1 #include <libkern/OSAtomic.h> | |
2 | |
3 #include "context.h" | |
4 #include "origin_cs.h" | |
5 | |
6 __code getQueue(struct Context* context, struct Queue* queue, struct Node* node) { | |
7 if (queue->first == 0) | |
8 return; | |
9 | |
10 struct Element* first = queue->first; | |
11 // if (__sync_bool_compare_and_swap(&queue->first, first, first->next)) { | |
12 if (OSAtomicCompareAndSwapPtr(first, first->next, (void*)&queue->first)) { | |
13 queue->count--; | |
14 | |
15 context->next = GetQueue; | |
16 stack_push(context->code_stack, &context->next); | |
17 | |
18 context->next = first->task->code; | |
19 node->key = first->task->key; | |
20 | |
21 goto meta(context, Get); | |
22 } else { | |
23 goto meta(context, GetQueue); | |
24 } | |
25 } | |
26 | |
27 __code getQueue_stub(struct Context* context) { | |
28 goto getQueue(context, &context->data[ActiveQueue]->queue, &context->data[Node]->node); | |
29 } |