diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 489e0a69d9..dcdc6b19ea 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -40,7 +40,7 @@ static void create_signal_trampoline(); RecursiveSpinLock g_processes_lock; static Atomic next_pid; -READONLY_AFTER_INIT InlineLinkedList* g_processes; +READONLY_AFTER_INIT Process::List* g_processes; READONLY_AFTER_INIT String* g_hostname; READONLY_AFTER_INIT Lock* g_hostname_lock; READONLY_AFTER_INIT HashMap>* g_modules; @@ -61,7 +61,7 @@ UNMAP_AFTER_INIT void Process::initialize() g_modules = new HashMap>; next_pid.store(0, AK::MemoryOrder::memory_order_release); - g_processes = new InlineLinkedList; + g_processes = new Process::List(); g_process_groups = new ProcessGroup::List(); g_hostname = new String("courage"); g_hostname_lock = new Lock; @@ -165,9 +165,9 @@ RefPtr Process::create_user_process(RefPtr& first_thread, const } { - ScopedSpinLock lock(g_processes_lock); - g_processes->prepend(process); process->ref(); + ScopedSpinLock lock(g_processes_lock); + g_processes->prepend(*process); } error = 0; return process; @@ -182,9 +182,9 @@ RefPtr Process::create_kernel_process(RefPtr& first_thread, Str first_thread->tss().esp = FlatPtr(entry_data); // entry function argument is expected to be in tss.esp if (process->pid() != 0) { - ScopedSpinLock lock(g_processes_lock); - g_processes->prepend(process); process->ref(); + ScopedSpinLock lock(g_processes_lock); + g_processes->prepend(*process); } ScopedSpinLock lock(g_scheduler_lock); @@ -270,8 +270,8 @@ Process::~Process() { ScopedSpinLock processes_lock(g_processes_lock); - if (prev() || next()) - g_processes->remove(this); + if (m_list_node.is_in_list()) + g_processes->remove(*this); } } @@ -571,17 +571,16 @@ void Process::die() { ScopedSpinLock lock(g_processes_lock); - for (auto* process = g_processes->head(); process;) { - auto* next_process = process->next(); - if (process->has_tracee_thread(pid())) { - dbgln_if(PROCESS_DEBUG, "Process {} ({}) is attached by {} ({}) which will exit", process->name(), process->pid(), name(), pid()); - process->stop_tracing(); - auto err = process->send_signal(SIGSTOP, this); + for (auto it = g_processes->begin(); it != g_processes->end();) { + auto& process = *it; + ++it; + if (process.has_tracee_thread(pid())) { + dbgln_if(PROCESS_DEBUG, "Process {} ({}) is attached by {} ({}) which will exit", process.name(), process.pid(), name(), pid()); + process.stop_tracing(); + auto err = process.send_signal(SIGSTOP, this); if (err.is_error()) - dbgln("Failed to send the SIGSTOP signal to {} ({})", process->name(), process->pid()); + dbgln("Failed to send the SIGSTOP signal to {} ({})", process.name(), process.pid()); } - - process = next_process; } } diff --git a/Kernel/Process.h b/Kernel/Process.h index 176bcd665d..0699511f8b 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -117,7 +117,6 @@ static_assert(sizeof(ProcessBase) == PAGE_SIZE); class Process : public ProcessBase , public RefCounted - , public InlineLinkedListNode , public Weakable { AK_MAKE_NONCOPYABLE(Process); @@ -125,7 +124,6 @@ class Process MAKE_ALIGNED_ALLOCATED(Process, PAGE_SIZE); - friend class InlineLinkedListNode; friend class Thread; friend class CoreDump; @@ -569,8 +567,7 @@ private: return nullptr; } - Process* m_prev { nullptr }; - Process* m_next { nullptr }; + IntrusiveListNode m_list_node; String m_name; @@ -649,9 +646,12 @@ private: HashMap m_coredump_metadata; NonnullRefPtrVector m_threads_for_coredump; + +public: + using List = IntrusiveList, &Process::m_list_node>; }; -extern InlineLinkedList* g_processes; +extern Process::List* g_processes; extern RecursiveSpinLock g_processes_lock; template Callback> @@ -659,11 +659,11 @@ inline void Process::for_each(Callback callback) { VERIFY_INTERRUPTS_DISABLED(); ScopedSpinLock lock(g_processes_lock); - for (auto* process = g_processes->head(); process;) { - auto* next_process = process->next(); - if (callback(*process) == IterationDecision::Break) + for (auto it = g_processes->begin(); it != g_processes->end();) { + auto& process = *it; + ++it; + if (callback(process) == IterationDecision::Break) break; - process = next_process; } } @@ -673,13 +673,13 @@ inline void Process::for_each_child(Callback callback) VERIFY_INTERRUPTS_DISABLED(); ProcessID my_pid = pid(); ScopedSpinLock lock(g_processes_lock); - for (auto* process = g_processes->head(); process;) { - auto* next_process = process->next(); - if (process->ppid() == my_pid || process->has_tracee_thread(pid())) { - if (callback(*process) == IterationDecision::Break) + for (auto it = g_processes->begin(); it != g_processes->end();) { + auto& process = *it; + ++it; + if (process.ppid() == my_pid || process.has_tracee_thread(pid())) { + if (callback(process) == IterationDecision::Break) break; } - process = next_process; } } @@ -712,13 +712,13 @@ inline void Process::for_each_in_pgrp(ProcessGroupID pgid, Callback callback) { VERIFY_INTERRUPTS_DISABLED(); ScopedSpinLock lock(g_processes_lock); - for (auto* process = g_processes->head(); process;) { - auto* next_process = process->next(); - if (!process->is_dead() && process->pgid() == pgid) { - if (callback(*process) == IterationDecision::Break) + for (auto it = g_processes->begin(); it != g_processes->end();) { + auto& process = *it; + ++it; + if (!process.is_dead() && process.pgid() == pgid) { + if (callback(process) == IterationDecision::Break) break; } - process = next_process; } } diff --git a/Kernel/Syscalls/fork.cpp b/Kernel/Syscalls/fork.cpp index 5da7afc28f..1f7d708642 100644 --- a/Kernel/Syscalls/fork.cpp +++ b/Kernel/Syscalls/fork.cpp @@ -82,7 +82,7 @@ KResultOr Process::sys$fork(RegisterState& regs) } ScopedSpinLock processes_lock(g_processes_lock); - g_processes->prepend(child); + g_processes->prepend(*child); } PerformanceManager::add_process_created_event(*child);