1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 22:07:34 +00:00

Kernel: Fix broken destruction order for Process/Thread.

This commit is contained in:
Andreas Kling 2019-03-24 01:20:35 +01:00
parent b6cd66c3b5
commit 5713c3a0cb
4 changed files with 7 additions and 4 deletions

1
Kernel/.gitignore vendored
View file

@ -7,3 +7,4 @@ kernel.map
_fs_contents _fs_contents
sync-local.sh sync-local.sh
*.pcap *.pcap
eth_null*

View file

@ -617,7 +617,7 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring
Process::~Process() 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; InterruptDisabler disabler;
system.nprocess--; system.nprocess--;
@ -1930,6 +1930,8 @@ void Process::finalize()
} }
} }
} }
m_dead = true;
} }
void Process::die() void Process::die()

View file

@ -53,8 +53,7 @@ public:
Ring3 = 3, Ring3 = 3,
}; };
// FIXME(Thread): Is this really how this should work? bool is_dead() const { return m_dead; }
bool is_dead() const { return main_thread().state() == Thread::State::Dead; }
Thread::State state() const { return main_thread().state(); } Thread::State state() const { return main_thread().state(); }
@ -311,6 +310,7 @@ private:
HashTable<gid_t> m_gids; HashTable<gid_t> m_gids;
bool m_being_inspected { false }; bool m_being_inspected { false };
bool m_dead { false };
int m_next_tid { 0 }; int m_next_tid { 0 };
}; };

View file

@ -72,7 +72,7 @@ bool Scheduler::pick_next()
if (thread.state() == Thread::BlockedWait) { if (thread.state() == Thread::BlockedWait) {
process.for_each_child([&] (Process& child) { process.for_each_child([&] (Process& child) {
if (child.state() != Thread::Dead) if (!child.is_dead())
return true; return true;
if (thread.waitee_pid() == -1 || thread.waitee_pid() == child.pid()) { if (thread.waitee_pid() == -1 || thread.waitee_pid() == child.pid()) {
thread.m_waitee_pid = child.pid(); thread.m_waitee_pid = child.pid();