diff options
| author | Michael Bebenita <mbebenita@mozilla.com> | 2010-07-19 14:05:18 -0700 |
|---|---|---|
| committer | Michael Bebenita <mbebenita@mozilla.com> | 2010-07-19 14:05:18 -0700 |
| commit | 00d1465d13980fc3acf650f182ee0723fbda0e06 (patch) | |
| tree | a73cf5f0f20c0bee6722b33d975eb930919fefdf /src/rt/sync/lock_free_queue.cpp | |
| parent | 1f0656d9084970fcc02ba9c27277265b8b3b7217 (diff) | |
| download | rust-00d1465d13980fc3acf650f182ee0723fbda0e06.tar.gz rust-00d1465d13980fc3acf650f182ee0723fbda0e06.zip | |
Added a message passing system based on lock free queues for inter-thread communication. Channels now buffer on the sending side, and no longer require blocking when sending. Lots of other refactoring and bug fixes.
Diffstat (limited to 'src/rt/sync/lock_free_queue.cpp')
| -rw-r--r-- | src/rt/sync/lock_free_queue.cpp | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/rt/sync/lock_free_queue.cpp b/src/rt/sync/lock_free_queue.cpp index 9d1081de88b..69241eced55 100644 --- a/src/rt/sync/lock_free_queue.cpp +++ b/src/rt/sync/lock_free_queue.cpp @@ -5,33 +5,46 @@ * dequeue() is not allowed to interrupt itself. */ +#include "../globals.h" #include "lock_free_queue.h" -lock_free_queue::lock_free_queue() : - tail(this) { +lock_free_queue_node::lock_free_queue_node() : next(NULL) { + +} + +lock_free_queue::lock_free_queue() : _tail(this) { + } -void lock_free_queue::enqueue(lock_free_queue_node *item) { - item->next = (lock_free_queue_node *) 0; - lock_free_queue_node *last = tail; - tail = item; - while (last->next) +void +lock_free_queue::enqueue(lock_free_queue_node *item) { + item->next = (lock_free_queue_node *) NULL; + lock_free_queue_node *last = _tail; + _tail = item; + while (last->next) { last = last->next; + } last->next = item; } -lock_free_queue_node *lockfree_queue::dequeue() { +lock_free_queue_node * +lock_free_queue::dequeue() { lock_free_queue_node *item = next; if (item && !(next = item->next)) { - tail = (lock_free_queue_node *) this; + _tail = (lock_free_queue_node *) this; if (item->next) { lock_free_queue_node *lost = item->next; lock_free_queue_node *help; do { help = lost->next; enqueue(lost); - } while ((lost = help) != (lock_free_queue_node *) 0); + } while ((lost = help) != (lock_free_queue_node *) NULL); } } return item; } + +bool +lock_free_queue::is_empty() { + return next == NULL; +} |
