Mercurial > hg > Papers > 2020 > soto-midterm
view src/putSynchronizedQueue.cbc @ 1:73127e0ab57c
(none)
author | soto@cr.ie.u-ryukyu.ac.jp |
---|---|
date | Tue, 08 Sep 2020 18:38:08 +0900 |
parents | |
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); } }