about summary refs log tree commit diff
path: root/src/rt/rust_kernel.cpp
diff options
context:
space:
mode:
authorMichael Bebenita <mbebenita@mozilla.com>2010-09-09 16:01:49 -0700
committerMichael Bebenita <mbebenita@mozilla.com>2010-09-10 14:38:31 -0700
commitf985fded3ede8a7677ca6c9c77817d27bc9ae492 (patch)
treebf956b68b6b5dfd8744a1b14e55425fac5ce6c3b /src/rt/rust_kernel.cpp
parent79dc07d6487612ebf9ac62e43a5729ea774488b9 (diff)
downloadrust-f985fded3ede8a7677ca6c9c77817d27bc9ae492.tar.gz
rust-f985fded3ede8a7677ca6c9c77817d27bc9ae492.zip
Added lock_and_signal::signal_all(), and made the rust_kernel::join() use wait instead of yield.
Diffstat (limited to 'src/rt/rust_kernel.cpp')
-rw-r--r--src/rt/rust_kernel.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp
index b70cdcbaf34..549b85d348c 100644
--- a/src/rt/rust_kernel.cpp
+++ b/src/rt/rust_kernel.cpp
@@ -22,7 +22,7 @@ rust_kernel::create_domain(const rust_crate *crate, const char *name) {
     message_queue->associate(handle);
     domains.append(dom);
     message_queues.append(message_queue);
-    _kernel_lock.signal();
+    _kernel_lock.signal_all();
     _kernel_lock.unlock();
     return handle;
 }
@@ -37,7 +37,7 @@ rust_kernel::destroy_domain(rust_dom *dom) {
     rust_srv *srv = dom->srv;
     delete dom;
     delete srv;
-    _kernel_lock.signal();
+    _kernel_lock.signal_all();
     _kernel_lock.unlock();
 }
 
@@ -91,10 +91,11 @@ rust_kernel::get_port_handle(rust_port *port) {
 
 void
 rust_kernel::join_all_domains() {
-    // TODO: Perhaps we can do this a little smarter. Just spin wait for now.
+    _kernel_lock.lock();
     while (domains.length() > 0) {
-        sync::yield();
+        _kernel_lock.wait();
     }
+    _kernel_lock.unlock();
     log(rust_log::KERN, "joined domains");
 }
 
@@ -162,7 +163,7 @@ rust_kernel::terminate_kernel_loop() {
     log(rust_log::KERN, "terminating kernel loop");
     _interrupt_kernel_loop = true;
     _kernel_lock.lock();
-    _kernel_lock.signal();
+    _kernel_lock.signal_all();
     _kernel_lock.unlock();
     join();
 }