From 5713c3a0cb804a71ab4ce0ccef1aad7915ed80f7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 24 Mar 2019 01:20:35 +0100 Subject: [PATCH] Kernel: Fix broken destruction order for Process/Thread. --- Kernel/.gitignore | 1 + Kernel/Process.cpp | 4 +++- Kernel/Process.h | 4 ++-- Kernel/Scheduler.cpp | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Kernel/.gitignore b/Kernel/.gitignore index cef27ed586..2057bb9bd0 100644 --- a/Kernel/.gitignore +++ b/Kernel/.gitignore @@ -7,3 +7,4 @@ kernel.map _fs_contents sync-local.sh *.pcap +eth_null* diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 6f771297d1..67bfa24abb 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -617,7 +617,7 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring Process::~Process() { - dbgprintf("~Process{%p} name=%s pid=%d\n", this, m_name.characters(), pid()); + dbgprintf("~Process{%p} name=%s pid=%d, m_fds=%d\n", this, m_name.characters(), pid(), m_fds.size()); InterruptDisabler disabler; system.nprocess--; @@ -1930,6 +1930,8 @@ void Process::finalize() } } } + + m_dead = true; } void Process::die() diff --git a/Kernel/Process.h b/Kernel/Process.h index 40a4c4234a..66d0770c41 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -53,8 +53,7 @@ public: Ring3 = 3, }; - // FIXME(Thread): Is this really how this should work? - bool is_dead() const { return main_thread().state() == Thread::State::Dead; } + bool is_dead() const { return m_dead; } Thread::State state() const { return main_thread().state(); } @@ -311,6 +310,7 @@ private: HashTable m_gids; bool m_being_inspected { false }; + bool m_dead { false }; int m_next_tid { 0 }; }; diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index ef5f4aede5..898bd0d9cd 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -72,7 +72,7 @@ bool Scheduler::pick_next() if (thread.state() == Thread::BlockedWait) { process.for_each_child([&] (Process& child) { - if (child.state() != Thread::Dead) + if (!child.is_dead()) return true; if (thread.waitee_pid() == -1 || thread.waitee_pid() == child.pid()) { thread.m_waitee_pid = child.pid();