@@ -83,11 +83,10 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac,
83
83
// The OS main scheduler may not exit while there are other
84
84
// schedulers
85
85
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);
88
88
assert (sched != NULL );
89
89
sched->disallow_exit ();
90
- sched_lock.lock ();
91
90
}
92
91
93
92
id = max_sched_id++;
@@ -106,6 +105,12 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac,
106
105
rust_scheduler *
107
106
rust_kernel::get_scheduler_by_id (rust_sched_id id) {
108
107
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 ();
109
114
sched_map::iterator iter = sched_table.find (id);
110
115
if (iter != sched_table.end ()) {
111
116
return iter->second ;
@@ -137,6 +142,7 @@ rust_kernel::wait_for_schedulers()
137
142
while (!sched_table.empty ()) {
138
143
while (!join_list.empty ()) {
139
144
rust_sched_id id = join_list.back ();
145
+ KLOG_ (" Deleting scheduler %d" , id);
140
146
join_list.pop_back ();
141
147
sched_map::iterator iter = sched_table.find (id);
142
148
I (this , iter != sched_table.end ());
@@ -146,12 +152,11 @@ rust_kernel::wait_for_schedulers()
146
152
delete sched;
147
153
if (sched_table.size () == 1 ) {
148
154
KLOG_ (" Allowing osmain scheduler to exit" );
149
- sched_lock.unlock ();
150
155
// 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);
152
158
assert (sched != NULL );
153
159
sched->allow_exit ();
154
- sched_lock.lock ();
155
160
}
156
161
}
157
162
if (!sched_table.empty ()) {
0 commit comments