From c35194547409b1218f5d50ce65e8f5c3968fabba Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 24 Aug 2021 00:34:11 +0200 Subject: [PATCH] Kernel: Simplify unregistering a Blocker from a BlockerSet The BlockerSet stores its blockers along with a "void* data" that may contain some blocker-specific context relevant to the specific blocker registration (for example, SelectBlocker stores a pointer to the relevant entry in an array of SelectBlocker::FDInfo structs.) When unregistering a blocker from a set, we don't need to key the blocker by both the Blocker* and the data. Just the Blocker* is enough, since all registrations for that blocker need to be removed anyway as the blocker is about to be destroyed. So we stop passing the "void* data" to BlockerSet::remove_blocker(), which also allows us to remove the now-unneeded Blocker::m_block_data. --- Kernel/Thread.h | 7 +++---- Kernel/ThreadBlockers.cpp | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Kernel/Thread.h b/Kernel/Thread.h index 5844aed347..91d2b065b6 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -393,7 +393,6 @@ public: private: BlockerSet* m_blocker_set { nullptr }; - void* m_block_data { nullptr }; Thread* m_blocked_thread { nullptr }; u8 m_was_interrupted_by_signal { 0 }; bool m_is_blocking { false }; @@ -423,12 +422,12 @@ public: return true; } - void remove_blocker(Blocker& blocker, void* data) + void remove_blocker(Blocker& blocker) { SpinlockLocker lock(m_lock); // NOTE: it's possible that the blocker is no longer present - m_blockers.remove_first_matching([&](auto& info) { - return info.blocker == &blocker && info.data == data; + m_blockers.remove_all_matching([&](auto& info) { + return info.blocker == &blocker; }); } diff --git a/Kernel/ThreadBlockers.cpp b/Kernel/ThreadBlockers.cpp index 116bd46e21..a8f4551c12 100644 --- a/Kernel/ThreadBlockers.cpp +++ b/Kernel/ThreadBlockers.cpp @@ -33,7 +33,6 @@ bool Thread::Blocker::add_to_blocker_set(Thread::BlockerSet& blocker_set, void* VERIFY(!m_blocker_set); if (blocker_set.add_blocker(*this, data)) { m_blocker_set = &blocker_set; - m_block_data = data; return true; } return false; @@ -43,7 +42,7 @@ Thread::Blocker::~Blocker() { VERIFY(!m_lock.is_locked()); if (m_blocker_set) - m_blocker_set->remove_blocker(*this, m_block_data); + m_blocker_set->remove_blocker(*this); } void Thread::Blocker::begin_blocking(Badge) @@ -355,7 +354,7 @@ Thread::SelectBlocker::SelectBlocker(FDVector& fds) Thread::SelectBlocker::~SelectBlocker() { for (auto& fd_entry : m_fds) - fd_entry.description->blocker_set().remove_blocker(*this, &fd_entry); + fd_entry.description->blocker_set().remove_blocker(*this); } void Thread::SelectBlocker::will_unblock_immediately_without_blocking(UnblockImmediatelyReason reason)