aboutsummaryrefslogtreecommitdiff
path: root/src/rt/sync
diff options
context:
space:
mode:
authorMichael Bebenita <[email protected]>2010-08-17 23:15:14 -0700
committerMichael Bebenita <[email protected]>2010-08-17 23:49:57 -0700
commit6e9f0f952d758bae2b530c2c9b780f2addf10207 (patch)
tree0b6925b02fd784c2303e7801823bf82dcf13dccc /src/rt/sync
parentUpdates to run.py. You can now pass in the rust_log and a flag to terminate o... (diff)
downloadrust-6e9f0f952d758bae2b530c2c9b780f2addf10207.tar.xz
rust-6e9f0f952d758bae2b530c2c9b780f2addf10207.zip
Made the lock_free_queue lock (temporarily, until fixed).
Diffstat (limited to 'src/rt/sync')
-rw-r--r--src/rt/sync/lock_free_queue.cpp4
-rw-r--r--src/rt/sync/lock_free_queue.h3
2 files changed, 7 insertions, 0 deletions
diff --git a/src/rt/sync/lock_free_queue.cpp b/src/rt/sync/lock_free_queue.cpp
index 69241ece..3f859862 100644
--- a/src/rt/sync/lock_free_queue.cpp
+++ b/src/rt/sync/lock_free_queue.cpp
@@ -18,6 +18,7 @@ lock_free_queue::lock_free_queue() : _tail(this) {
void
lock_free_queue::enqueue(lock_free_queue_node *item) {
+ lock.lock();
item->next = (lock_free_queue_node *) NULL;
lock_free_queue_node *last = _tail;
_tail = item;
@@ -25,10 +26,12 @@ lock_free_queue::enqueue(lock_free_queue_node *item) {
last = last->next;
}
last->next = item;
+ lock.unlock();
}
lock_free_queue_node *
lock_free_queue::dequeue() {
+ lock.lock();
lock_free_queue_node *item = next;
if (item && !(next = item->next)) {
_tail = (lock_free_queue_node *) this;
@@ -41,6 +44,7 @@ lock_free_queue::dequeue() {
} while ((lost = help) != (lock_free_queue_node *) NULL);
}
}
+ lock.unlock();
return item;
}
diff --git a/src/rt/sync/lock_free_queue.h b/src/rt/sync/lock_free_queue.h
index 1f09ec52..c1a309b8 100644
--- a/src/rt/sync/lock_free_queue.h
+++ b/src/rt/sync/lock_free_queue.h
@@ -1,6 +1,8 @@
#ifndef LOCK_FREE_QUEUE_H
#define LOCK_FREE_QUEUE_H
+#include "spin_lock.h"
+
class lock_free_queue_node {
public:
lock_free_queue_node *next;
@@ -8,6 +10,7 @@ public:
};
class lock_free_queue : lock_free_queue_node {
+ spin_lock lock;
lock_free_queue_node *_tail;
public:
lock_free_queue();