aboutsummaryrefslogtreecommitdiff
path: root/src/rt/sync/lock_free_queue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt/sync/lock_free_queue.cpp')
-rw-r--r--src/rt/sync/lock_free_queue.cpp33
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 9d1081de..69241ece 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;
+}