From 1bd331b7aaa24245f86868305ab64600683a41e1 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Wed, 15 Sep 2010 11:56:45 -0700 Subject: Fixed deadlock caused by the message pump not being notified of new message sends. --- src/rt/rust_kernel.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src/rt/rust_kernel.cpp') diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp index ef4220f9129..0dc1369dca6 100644 --- a/src/rt/rust_kernel.cpp +++ b/src/rt/rust_kernel.cpp @@ -164,9 +164,7 @@ void rust_kernel::terminate_kernel_loop() { log(rust_log::KERN, "terminating kernel loop"); _interrupt_kernel_loop = true; - _kernel_lock.lock(); - _kernel_lock.signal_all(); - _kernel_lock.unlock(); + signal_kernel_lock(); join(); } @@ -217,6 +215,23 @@ rust_kernel::free_handles(hash_map* > &map) { } } +void +rust_kernel::notify_message_enqueued(rust_message_queue *queue, + rust_message *message) { + // The message pump needs to handle this message if the queue is not + // associated with a domain, therefore signal the message pump. + if (queue->is_associated() == false) { + signal_kernel_lock(); + } +} + +void +rust_kernel::signal_kernel_lock() { + _kernel_lock.lock(); + _kernel_lock.signal_all(); + _kernel_lock.unlock(); +} + // // Local Variables: // mode: C++ -- cgit 1.4.1-3-g733a5