view src/sync_dequeue.c @ 9:a8c53472e1a3

add file
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Tue, 09 Feb 2016 17:24:07 +0900
parents
children 12d1c2f53258
line wrap: on
line source

// Dequeue
__code getQueue(struct Context* context, struct Queue* queue, struct Node* node) {
    if (queue->first == 0)
        return;

    struct Element* first = queue->first;
    if (__sync_bool_compare_and_swap(&queue->first, first, first->next)) {
        //    if (OSAtomicCompareAndSwapPtr(first, first->next, (void*)&queue->first)) {
        queue->count--;

        context->next = GetQueue;
        stack_push(context->code_stack, &context->next);

        context->next = first->task->code;
        node->key = first->task->key;

        goto meta(context, Get);
    } else {
        goto meta(context, GetQueue);
    }
}

// Meta Code Gear(stub)
__code getQueue_stub(struct Context* context) {
    goto getQueue(context,
                  &context->data[ActiveQueue]->queue,
                  &context->data[Node]->node);
}