view paper/src/sync_enqueue.c @ 1:19917a6272f6

sigos_test
author suruga
date Thu, 20 Apr 2017 16:29:05 +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);
    }
}