diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index ad63d8ae..bd8e5d0c 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -61,7 +60,8 @@ namespace Kernel Process::~Process() { - exit(); + if (!m_threads.empty()) + exit(); } BAN::ErrorOr Process::add_thread(entry_t entry, void* data) @@ -85,14 +85,24 @@ namespace Kernel for (size_t i = 0; i < m_threads.size(); i++) if (m_threads[i] == &thread) m_threads.remove(i); + if (m_threads.empty()) + exit(); } void Process::exit() { - CriticalScope _; + m_lock.lock(); m_threads.clear(); for (auto& open_fd : m_open_files) open_fd.inode = nullptr; + + dprintln("process {} exit", pid()); + s_process_lock.lock(); + for (size_t i = 0; i < s_processes.size(); i++) + if (s_processes[i] == this) + s_processes.remove(i); + s_process_lock.unlock(); + Scheduler::get().set_current_process_done(); } diff --git a/kernel/kernel/Scheduler.cpp b/kernel/kernel/Scheduler.cpp index f5dee5c2..6ad00a99 100644 --- a/kernel/kernel/Scheduler.cpp +++ b/kernel/kernel/Scheduler.cpp @@ -245,7 +245,8 @@ namespace Kernel void Scheduler::set_current_process_done() { - VERIFY_CLI(); + VERIFY_STI(); + DISABLE_INTERRUPTS(); pid_t pid = m_current_thread->thread->process().pid(); @@ -253,6 +254,7 @@ namespace Kernel remove_threads(m_sleeping_threads, it->thread->process().pid() == pid); remove_threads(m_active_threads, it != m_current_thread && it->thread->process().pid() == pid); + delete &m_current_thread->thread->process(); delete m_current_thread->thread; remove_and_advance_current_thread(); execute_current_thread();