diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-04-03 17:39:35 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-04-03 18:01:13 -0700 |
| commit | c0e12854edc10070759688b598a3885cbeb82e28 (patch) | |
| tree | a2f83f94dde2dda6d73b963bb815f795600ad0b4 /src/rt/rust_kernel.cpp | |
| parent | bef72447e75b7e37f43d3a82ce40e419c7f747d2 (diff) | |
| download | rust-c0e12854edc10070759688b598a3885cbeb82e28.tar.gz rust-c0e12854edc10070759688b598a3885cbeb82e28.zip | |
rt: Fix bugs in the osmain scheduler
Diffstat (limited to 'src/rt/rust_kernel.cpp')
| -rw-r--r-- | src/rt/rust_kernel.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp index d65837a47d6..228a45bbae4 100644 --- a/src/rt/rust_kernel.cpp +++ b/src/rt/rust_kernel.cpp @@ -78,6 +78,18 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac, rust_scheduler *sched; { scoped_lock with(sched_lock); + + if (sched_table.size() == 1) { + // 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); + assert(sched != NULL); + sched->disallow_exit(); + sched_lock.lock(); + } + id = max_sched_id++; K(srv, id != INTPTR_MAX, "Hit the maximum scheduler id"); sched = new (this, "rust_scheduler") @@ -138,8 +150,8 @@ rust_kernel::wait_for_schedulers() // It's only the osmain scheduler left. Tell it to exit rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler); assert(sched != NULL); - sched_lock.lock(); sched->allow_exit(); + sched_lock.lock(); } } if (!sched_table.empty()) { |
