From 5917ca35190b526b65b4d26ad0b98024ce9e0b09 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Mon, 9 Aug 2010 08:06:08 -0700 Subject: Fixed deadlock in the scheduler caused by condition variables. --- src/rt/rust_dom.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/rt/rust_dom.cpp') diff --git a/src/rt/rust_dom.cpp b/src/rt/rust_dom.cpp index f0739097..b66fca82 100644 --- a/src/rt/rust_dom.cpp +++ b/src/rt/rust_dom.cpp @@ -262,8 +262,6 @@ void rust_dom::send_message(rust_message *message) { this); A(this, message->dom == this, "Message owned by non-local domain."); _incoming_message_queue.enqueue(message); - _incoming_message_pending.signal(); - _progress.signal(); } /** @@ -398,9 +396,11 @@ rust_dom::start_main_loop() "all tasks are blocked, waiting for progress ..."); if (_log.is_tracing(rust_log::TASK)) log_state(); - _progress.wait(); log(rust_log::TASK, - "progress made, resuming ..."); + "all tasks are blocked, scheduler yielding ..."); + sync::yield(); + log(rust_log::TASK, + "scheduler resuming ..."); continue; } @@ -450,7 +450,14 @@ rust_dom::start_main_loop() } if (_incoming_message_queue.is_empty()) { - _incoming_message_pending.wait(); + log(rust_log::DOM, + "waiting for %d dead tasks to become dereferenced, " + "scheduler yielding ...", + dead_tasks.length()); + if (_log.is_tracing(rust_log::TASK)) { + log_state(); + } + sync::yield(); } else { drain_incoming_message_queue(); } -- cgit v1.2.3