1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 05:05:08 +00:00

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.
This commit is contained in:
Andreas Kling 2021-08-24 00:34:11 +02:00
parent 6ce05026b4
commit c351945474
2 changed files with 5 additions and 7 deletions

View file

@ -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;
});
}

View file

@ -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<Thread>)
@ -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)