Skip to content

Commit 4cf7efc

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

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

src/rt/rust_kernel.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,10 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac,
8383
// The OS main scheduler may not exit while there are other
8484
// schedulers
8585
KLOG_("Disallowing osmain scheduler to exit");
86-
sched_lock.unlock();
87-
rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler);
86+
rust_scheduler *sched =
87+
get_scheduler_by_id_nolock(osmain_scheduler);
8888
assert(sched != NULL);
8989
sched->disallow_exit();
90-
sched_lock.lock();
9190
}
9291

9392
id = max_sched_id++;
@@ -106,6 +105,12 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac,
106105
rust_scheduler *
107106
rust_kernel::get_scheduler_by_id(rust_sched_id id) {
108107
scoped_lock with(sched_lock);
108+
return get_scheduler_by_id_nolock(id);
109+
}
110+
111+
rust_scheduler *
112+
rust_kernel::get_scheduler_by_id_nolock(rust_sched_id id) {
113+
sched_lock.must_have_lock();
109114
sched_map::iterator iter = sched_table.find(id);
110115
if (iter != sched_table.end()) {
111116
return iter->second;
@@ -137,6 +142,7 @@ rust_kernel::wait_for_schedulers()
137142
while (!sched_table.empty()) {
138143
while (!join_list.empty()) {
139144
rust_sched_id id = join_list.back();
145+
KLOG_("Deleting scheduler %d", id);
140146
join_list.pop_back();
141147
sched_map::iterator iter = sched_table.find(id);
142148
I(this, iter != sched_table.end());
@@ -146,12 +152,11 @@ rust_kernel::wait_for_schedulers()
146152
delete sched;
147153
if (sched_table.size() == 1) {
148154
KLOG_("Allowing osmain scheduler to exit");
149-
sched_lock.unlock();
150155
// It's only the osmain scheduler left. Tell it to exit
151-
rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler);
156+
rust_scheduler *sched =
157+
get_scheduler_by_id_nolock(osmain_scheduler);
152158
assert(sched != NULL);
153159
sched->allow_exit();
154-
sched_lock.lock();
155160
}
156161
}
157162
if (!sched_table.empty()) {

src/rt/rust_kernel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class rust_kernel {
5757
// on the main thread
5858
rust_sched_driver *osmain_driver;
5959

60+
rust_scheduler* get_scheduler_by_id_nolock(rust_sched_id id);
61+
6062
public:
6163

6264
struct rust_env *env;

0 commit comments

Comments
 (0)