Mercurial > hg > Papers > 2018 > parusu-master
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); } }