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 }