view paper/src/sync_enqueue.c @ 1:59cb9d3f9a55

add
author mir3636
date Fri, 14 Apr 2017 23:30:08 +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);
    }
}