view paper/src/sync_enqueue.c @ 0:38b037c42c34

first commit
author ikkun
date Mon, 17 Apr 2017 20:05:26 +0900
parents
children
line wrap: on
line source

// Enqueue(normal)
__code putQueue3(struct Context* context, struct Queue* queue, struct Element* new_element) {
    struct Element* last = queue->last;

    if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) {
        last->next = new_element;
        queue->count++;
        
        goto meta(context, context->next);
    } else {
        goto meta(context, PutQueue3);
    }
}

// Enqueue(nothing element)
__code putQueue4(struct Context* context, struct Queue* queue, struct Element* new_element) {
    if (__sync_bool_compare_and_swap(&queue->first, 0, new_element)) {
        queue->last = new_element;
        queue->count++;
        
        goto meta(context, context->next);
    } else {
        goto meta(context, PutQueue3);
    }
}