diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 4dac50b64f..69dfc37575 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -64,6 +64,12 @@ VirtualAddress g_return_to_ring3_from_signal_trampoline; VirtualAddress g_return_to_ring0_from_signal_trampoline; HashMap>* g_modules; +pid_t Process::allocate_pid() +{ + InterruptDisabler disabler; + return next_pid++; +} + void Process::initialize() { g_modules = new HashMap>; @@ -854,7 +860,7 @@ Process* Process::create_kernel_process(Thread*& first_thread, String&& name, vo Process::Process(Thread*& first_thread, const String& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring, RefPtr cwd, RefPtr executable, TTY* tty, Process* fork_parent) : m_name(move(name)) - , m_pid(next_pid++) // FIXME: RACE: This variable looks racy! + , m_pid(allocate_pid()) , m_uid(uid) , m_gid(gid) , m_euid(uid) diff --git a/Kernel/Process.h b/Kernel/Process.h index bcd9053182..acfb901266 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -310,6 +310,7 @@ private: friend class Region; Process(Thread*& first_thread, const String& name, uid_t, gid_t, pid_t ppid, RingLevel, RefPtr cwd = nullptr, RefPtr executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr); + static pid_t allocate_pid(); Range allocate_range(VirtualAddress, size_t); diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 843ecc18ac..c3d62b13c7 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -43,9 +43,14 @@ HashTable& thread_table() Thread::Thread(Process& process) : m_process(process) - , m_tid(process.m_next_tid++) , m_name(process.name()) { + if (m_process.m_thread_count == 0) { + // First thread gets TID == PID + m_tid = process.pid(); + } else { + m_tid = Process::allocate_pid(); + } process.m_thread_count++; dbgprintf("Thread{%p}: New thread TID=%u in %s(%u)\n", this, m_tid, process.name().characters(), process.pid()); set_default_signal_dispositions();