Skip to content

Commit c0e1285

Browse files
committed
rt: Fix bugs in the osmain scheduler
1 parent bef7244 commit c0e1285

File tree

4 files changed

+21
-2
lines changed

4 files changed

+21
-2
lines changed

src/rt/rust_kernel.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac,
7878
rust_scheduler *sched;
7979
{
8080
scoped_lock with(sched_lock);
81+
82+
if (sched_table.size() == 1) {
83+
// The OS main scheduler may not exit while there are other
84+
// schedulers
85+
KLOG_("Disallowing osmain scheduler to exit");
86+
sched_lock.unlock();
87+
rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler);
88+
assert(sched != NULL);
89+
sched->disallow_exit();
90+
sched_lock.lock();
91+
}
92+
8193
id = max_sched_id++;
8294
K(srv, id != INTPTR_MAX, "Hit the maximum scheduler id");
8395
sched = new (this, "rust_scheduler")
@@ -138,8 +150,8 @@ rust_kernel::wait_for_schedulers()
138150
// It's only the osmain scheduler left. Tell it to exit
139151
rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler);
140152
assert(sched != NULL);
141-
sched_lock.lock();
142153
sched->allow_exit();
154+
sched_lock.lock();
143155
}
144156
}
145157
if (!sched_table.empty()) {

src/rt/rust_scheduler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,9 @@ rust_scheduler::allow_exit() {
152152
exit();
153153
}
154154
}
155+
156+
void
157+
rust_scheduler::disallow_exit() {
158+
scoped_lock with(lock);
159+
may_exit = false;
160+
}

src/rt/rust_scheduler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class rust_scheduler : public kernel_owned<rust_scheduler> {
5858
// Tells the scheduler that as soon as it runs out of tasks
5959
// to run it should exit
6060
void allow_exit();
61+
void disallow_exit();
6162
};
6263

6364
#endif /* RUST_SCHEDULER_H */

src/test/run-pass/osmain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// while it is not in use.
44

55
fn main() {
6-
run(10);
6+
run(100);
77
}
88

99
fn run(i: int) {

0 commit comments

Comments
 (0)