rt: Fix bugs in the osmain scheduler
This commit is contained in:
@@ -83,11 +83,10 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac,
|
|||||||
// The OS main scheduler may not exit while there are other
|
// The OS main scheduler may not exit while there are other
|
||||||
// schedulers
|
// schedulers
|
||||||
KLOG_("Disallowing osmain scheduler to exit");
|
KLOG_("Disallowing osmain scheduler to exit");
|
||||||
sched_lock.unlock();
|
rust_scheduler *sched =
|
||||||
rust_scheduler *sched = get_scheduler_by_id(osmain_scheduler);
|
get_scheduler_by_id_nolock(osmain_scheduler);
|
||||||
assert(sched != NULL);
|
assert(sched != NULL);
|
||||||
sched->disallow_exit();
|
sched->disallow_exit();
|
||||||
sched_lock.lock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
id = max_sched_id++;
|
id = max_sched_id++;
|
||||||
@@ -106,6 +105,12 @@ rust_kernel::create_scheduler(rust_sched_launcher_factory *launchfac,
|
|||||||
rust_scheduler *
|
rust_scheduler *
|
||||||
rust_kernel::get_scheduler_by_id(rust_sched_id id) {
|
rust_kernel::get_scheduler_by_id(rust_sched_id id) {
|
||||||
scoped_lock with(sched_lock);
|
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);
|
sched_map::iterator iter = sched_table.find(id);
|
||||||
if (iter != sched_table.end()) {
|
if (iter != sched_table.end()) {
|
||||||
return iter->second;
|
return iter->second;
|
||||||
@@ -137,6 +142,7 @@ rust_kernel::wait_for_schedulers()
|
|||||||
while (!sched_table.empty()) {
|
while (!sched_table.empty()) {
|
||||||
while (!join_list.empty()) {
|
while (!join_list.empty()) {
|
||||||
rust_sched_id id = join_list.back();
|
rust_sched_id id = join_list.back();
|
||||||
|
KLOG_("Deleting scheduler %d", id);
|
||||||
join_list.pop_back();
|
join_list.pop_back();
|
||||||
sched_map::iterator iter = sched_table.find(id);
|
sched_map::iterator iter = sched_table.find(id);
|
||||||
I(this, iter != sched_table.end());
|
I(this, iter != sched_table.end());
|
||||||
@@ -146,12 +152,11 @@ rust_kernel::wait_for_schedulers()
|
|||||||
delete sched;
|
delete sched;
|
||||||
if (sched_table.size() == 1) {
|
if (sched_table.size() == 1) {
|
||||||
KLOG_("Allowing osmain scheduler to exit");
|
KLOG_("Allowing osmain scheduler to exit");
|
||||||
sched_lock.unlock();
|
|
||||||
// It's only the osmain scheduler left. Tell it to exit
|
// 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);
|
assert(sched != NULL);
|
||||||
sched->allow_exit();
|
sched->allow_exit();
|
||||||
sched_lock.lock();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!sched_table.empty()) {
|
if (!sched_table.empty()) {
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ private:
|
|||||||
// on the main thread
|
// on the main thread
|
||||||
rust_sched_driver *osmain_driver;
|
rust_sched_driver *osmain_driver;
|
||||||
|
|
||||||
|
rust_scheduler* get_scheduler_by_id_nolock(rust_sched_id id);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct rust_env *env;
|
struct rust_env *env;
|
||||||
|
|||||||
Reference in New Issue
Block a user