view Paper/src/sync_enqueue.c @ 8:a6372acc8f0e

fix
author mir3636
date Fri, 22 Dec 2017 17:22:47 +0900
parents dbbe5ef644fb
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);
    }
}