view paper/src/putSynchronizedQueue.cbc @ 15:7b64596f5964

Fix
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Wed, 24 Jan 2018 03:52:00 +0900
parents paper/src/takeSynchronizedQueue.cbc@c615afa6c8b9
children
line wrap: on
line source

__code putSynchronizedQueue(struct SynchronizedQueue* queue, union Data* data, __code next(...)) {
    Element* element = new Element();
    element->data = data;
    element->next = NULL;
    Element* last = queue->last;
    Element* nextElement = last->next;
    if (last != queue->last) {
        goto putSynchronizedQueue();
    }
    if (nextElement == NULL) {
        struct Atomic* atomic = queue->atomic;
        goto atomic->checkAndSet(&last->next, nextElement, element, next(...), putSynchronizedQueue);
    } else { // wrong last element
        struct Atomic* atomic = queue->atomic;
        goto atomic->checkAndSet(&queue->last, last, nextElement, putSynchronizedQueue, putSynchronizedQueue);
    }
}