diff options
| author | Michael Bebenita <mbebenita@mozilla.com> | 2010-09-09 16:01:49 -0700 |
|---|---|---|
| committer | Michael Bebenita <mbebenita@mozilla.com> | 2010-09-10 14:38:31 -0700 |
| commit | f985fded3ede8a7677ca6c9c77817d27bc9ae492 (patch) | |
| tree | bf956b68b6b5dfd8744a1b14e55425fac5ce6c3b /src/rt/rust_kernel.cpp | |
| parent | 79dc07d6487612ebf9ac62e43a5729ea774488b9 (diff) | |
| download | rust-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.cpp | 11 |
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(); } |
