summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kernel/Process.cpp10
-rw-r--r--Kernel/Process.h52
-rw-r--r--Kernel/Thread.h3
3 files changed, 38 insertions, 27 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index b417b6d40d..55cce1afd0 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -856,8 +856,9 @@ bool Process::remove_thread(Thread& thread)
ProtectedDataMutationScope scope { *this };
auto thread_cnt_before = m_thread_count.fetch_sub(1, AK::MemoryOrder::memory_order_acq_rel);
VERIFY(thread_cnt_before != 0);
- ScopedSpinLock thread_list_lock(m_thread_list_lock);
- m_thread_list.remove(thread);
+ thread_list().with([&](auto& thread_list) {
+ thread_list.remove(thread);
+ });
return thread_cnt_before == 1;
}
@@ -865,8 +866,9 @@ bool Process::add_thread(Thread& thread)
{
ProtectedDataMutationScope scope { *this };
bool is_first = m_thread_count.fetch_add(1, AK::MemoryOrder::memory_order_relaxed) == 0;
- ScopedSpinLock thread_list_lock(m_thread_list_lock);
- m_thread_list.append(thread);
+ thread_list().with([&](auto& thread_list) {
+ thread_list.append(thread);
+ });
return is_first;
}
diff --git a/Kernel/Process.h b/Kernel/Process.h
index d060194a40..5e4d89c4e7 100644
--- a/Kernel/Process.h
+++ b/Kernel/Process.h
@@ -102,7 +102,6 @@ protected:
mode_t m_umask { 022 };
VirtualAddress m_signal_trampoline;
Atomic<u32> m_thread_count { 0 };
- IntrusiveList<Thread, RawPtr<Thread>, &Thread::m_process_thread_list_node> m_thread_list;
u8 m_termination_status { 0 };
u8 m_termination_signal { 0 };
};
@@ -724,9 +723,12 @@ public:
const FileDescriptions& fds() const { return m_fds; }
private:
- FileDescriptions m_fds;
+ SpinLockProtectedValue<Thread::ListInProcess>& thread_list() { return m_thread_list; }
+ SpinLockProtectedValue<Thread::ListInProcess> const& thread_list() const { return m_thread_list; }
+
+ SpinLockProtectedValue<Thread::ListInProcess> m_thread_list;
- mutable RecursiveSpinLock m_thread_list_lock;
+ FileDescriptions m_fds;
const bool m_is_kernel_process;
Atomic<State> m_state { State::Running };
@@ -818,25 +820,27 @@ inline void Process::for_each_child(Callback callback)
template<IteratorFunction<Thread&> Callback>
inline IterationDecision Process::for_each_thread(Callback callback) const
{
- ScopedSpinLock thread_list_lock(m_thread_list_lock);
- for (auto& thread : m_thread_list) {
- IterationDecision decision = callback(thread);
- if (decision != IterationDecision::Continue)
- return decision;
- }
- return IterationDecision::Continue;
+ return thread_list().with([&](auto& thread_list) -> IterationDecision {
+ for (auto& thread : thread_list) {
+ IterationDecision decision = callback(thread);
+ if (decision != IterationDecision::Continue)
+ return decision;
+ }
+ return IterationDecision::Continue;
+ });
}
template<IteratorFunction<Thread&> Callback>
inline IterationDecision Process::for_each_thread(Callback callback)
{
- ScopedSpinLock thread_list_lock(m_thread_list_lock);
- for (auto& thread : m_thread_list) {
- IterationDecision decision = callback(thread);
- if (decision != IterationDecision::Continue)
- return decision;
- }
- return IterationDecision::Continue;
+ return thread_list().with([&](auto& thread_list) -> IterationDecision {
+ for (auto& thread : thread_list) {
+ IterationDecision decision = callback(thread);
+ if (decision != IterationDecision::Continue)
+ return decision;
+ }
+ return IterationDecision::Continue;
+ });
}
template<IteratorFunction<Process&> Callback>
@@ -875,18 +879,20 @@ inline void Process::for_each_child(Callback callback)
template<VoidFunction<Thread&> Callback>
inline IterationDecision Process::for_each_thread(Callback callback) const
{
- ScopedSpinLock thread_list_lock(m_thread_list_lock);
- for (auto& thread : m_thread_list)
- callback(thread);
+ thread_list().with([&](auto& thread_list) {
+ for (auto& thread : thread_list)
+ callback(thread);
+ });
return IterationDecision::Continue;
}
template<VoidFunction<Thread&> Callback>
inline IterationDecision Process::for_each_thread(Callback callback)
{
- ScopedSpinLock thread_list_lock(m_thread_list_lock);
- for (auto& thread : m_thread_list)
- callback(thread);
+ thread_list().with([&](auto& thread_list) {
+ for (auto& thread : thread_list)
+ callback(thread);
+ });
return IterationDecision::Continue;
}
diff --git a/Kernel/Thread.h b/Kernel/Thread.h
index 827199bd55..172e580fb7 100644
--- a/Kernel/Thread.h
+++ b/Kernel/Thread.h
@@ -1372,6 +1372,9 @@ private:
void yield_and_release_relock_big_lock();
void yield_assuming_not_holding_big_lock();
void drop_thread_count(bool);
+
+public:
+ using ListInProcess = IntrusiveList<Thread, RawPtr<Thread>, &Thread::m_process_thread_list_node>;
};
AK_ENUM_BITWISE_OPERATORS(Thread::FileBlocker::BlockFlags);