Mercurial > hg > Papers > 2018 > parusu-master
view paper/src/putSynchronizedQueue.cbc @ 126:d15c0f582bb7 default tip
Fix
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 01 Mar 2018 16:56:54 +0900 |
parents | 7b64596f5964 |
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); } }