fix(kernel): fix kill wait-queue cleanup, RegionId tracking, ReleasePages ownership, and SwitchTo scheduler state
This commit is contained in:
@@ -136,6 +136,31 @@ impl<P: Platform> Kernel<P> {
|
||||
self.processes.get(pid).is_ok()
|
||||
}
|
||||
|
||||
pub(crate) fn cleanup_threads(&mut self, thread_ids: &[Option<ThreadId>; 4]) {
|
||||
use domain::scheduler::Scheduler;
|
||||
for slot in thread_ids {
|
||||
if let Some(tid) = slot {
|
||||
self.endpoints.remove_thread_from_all(*tid);
|
||||
self.cleanup_wait_any(*tid);
|
||||
self.scheduler.remove(*tid);
|
||||
self.pending_messages[tid.raw() as usize] = None;
|
||||
self.pending_results[tid.raw() as usize] = None;
|
||||
let _ = self.threads.destroy(*tid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn cleanup_wait_any(&mut self, tid: ThreadId) {
|
||||
if let Some(wait_set) = self.wait_sets[tid.raw() as usize].take() {
|
||||
for ep_slot in wait_set.endpoints() {
|
||||
if let Some(_slot) = ep_slot {
|
||||
self.endpoints.remove_thread_from_all(tid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn check_cap(
|
||||
&self,
|
||||
owner: ProcessId,
|
||||
|
||||
Reference in New Issue
Block a user