| 390 | void Process::cleanup_function(Thread* thread) |
| 391 | { |
| 392 | { |
| 393 | SpinLockGuard _(s_process_lock); |
| 394 | for (size_t i = 0; i < s_processes.size(); i++) |
| 395 | { |
| 396 | if (s_processes[i] != this) |
| 397 | continue; |
| 398 | s_processes.remove(i); |
| 399 | break; |
| 400 | } |
| 401 | for (auto it = s_alarm_processes.begin(); it != s_alarm_processes.end();) |
| 402 | { |
| 403 | if (*it == this) |
| 404 | it = s_alarm_processes.remove(it); |
| 405 | else |
| 406 | it++; |
| 407 | } |
| 408 | } |
| 409 | |
| 410 | m_exited_threads.clear(); |
| 411 | |
| 412 | ProcFileSystem::get().on_process_delete(*this); |
| 413 | |
| 414 | m_process_lock.lock(); |
| 415 | m_memory_region_lock.wr_lock(); |
| 416 | |
| 417 | m_open_file_descriptors.close_all(); |
| 418 | |
| 419 | m_root_file = {}; |
| 420 | m_working_directory = {}; |
| 421 | |
| 422 | // NOTE: We must unmap ranges while the page table is still alive |
| 423 | m_mapped_regions.clear(); |
| 424 | |
| 425 | // After we give our page table to the thread, we cannot get rescheduled |
| 426 | Processor::set_interrupt_state(InterruptState::Disabled); |
| 427 | thread->give_keep_alive_page_table(BAN::move(m_page_table)); |
| 428 | } |
| 429 | |
| 430 | bool Process::on_thread_exit(Thread& thread) |
no test coverage detected