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()) { diff --git a/src/rt/rust_kernel.h b/src/rt/rust_kernel.h index 927da963dad..52399cf4e2c 100644 --- a/src/rt/rust_kernel.h +++ b/src/rt/rust_kernel.h @@ -57,6 +57,8 @@ private: // on the main thread rust_sched_driver *osmain_driver; + rust_scheduler* get_scheduler_by_id_nolock(rust_sched_id id); + public: struct rust_env *env;