diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-04-03 18:54:57 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-04-03 20:24:29 -0700 |
| commit | 4cf7efc8f7df215b0ff9e3ea15b7890b84db1b51 (patch) | |
| tree | 77e9ae322815a9a749b7116348863eeb64868e34 /src/rt/rust_kernel.cpp | |
| parent | c0e12854edc10070759688b598a3885cbeb82e28 (diff) | |
| download | rust-4cf7efc8f7df215b0ff9e3ea15b7890b84db1b51.tar.gz rust-4cf7efc8f7df215b0ff9e3ea15b7890b84db1b51.zip | |
rt: Fix bugs in the osmain scheduler
Diffstat (limited to 'src/rt/rust_kernel.cpp')
| -rw-r--r-- | src/rt/rust_kernel.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp index 228a45bbae4..32e34dc9337 100644 --- a/src/rt/rust_kernel.cpp +++ b/src/rt/rust_kernel.cpp @@ -83,11 +83,10 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac, // The OS main scheduler may not exit while there are other // schedulers KLOG_("Disallowing osmain scheduler to exit"); - sched_lock.unlock(); - rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler); + rust_scheduler *sched = + get_scheduler_by_id_nolock(osmain_scheduler); assert(sched != NULL); sched->disallow_exit(); - sched_lock.lock(); } id = max_sched_id++; @@ -106,6 +105,12 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac, rust_scheduler * rust_kernel::get_scheduler_by_id(rust_sched_id id) { scoped_lock with(sched_lock); + return get_scheduler_by_id_nolock(id); +} + +rust_scheduler * +rust_kernel::get_scheduler_by_id_nolock(rust_sched_id id) { + sched_lock.must_have_lock(); sched_map::iterator iter = sched_table.find(id); if (iter != sched_table.end()) { return iter->second; @@ -137,6 +142,7 @@ rust_kernel::wait_for_schedulers() while (!sched_table.empty()) { while (!join_list.empty()) { rust_sched_id id = join_list.back(); + KLOG_("Deleting scheduler %d", id); join_list.pop_back(); sched_map::iterator iter = sched_table.find(id); I(this, iter != sched_table.end()); @@ -146,12 +152,11 @@ rust_kernel::wait_for_schedulers() delete sched; if (sched_table.size() == 1) { KLOG_("Allowing osmain scheduler to exit"); - sched_lock.unlock(); // It's only the osmain scheduler left. Tell it to exit - rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler); + rust_scheduler *sched = + get_scheduler_by_id_nolock(osmain_scheduler); assert(sched != NULL); sched->allow_exit(); - sched_lock.lock(); } } if (!sched_table.empty()) { |
