LibCore+LibWeb: Remove the dummy EventReceiver from deferred_invoke()

The DeferredInvocationContext only existed to satisfy the requirement
in ThreadEventQueue that each event has an EventReceiver. However,
deferred_invoke() was not even using the EventReceiver to call its
callback. Therefore, we don't need to allocate one for every deferred
invocation.

This also prevents WeakPtr::strong_ref() from racing and leaking the
context object when invoking a function across threads.
This commit is contained in:
Zaggy1024 2025-12-02 01:31:00 -06:00 committed by Gregory Bertilson
parent 970100e789
commit b572ae95a9
Notes: github-actions[bot] 2025-12-03 03:21:58 +00:00
14 changed files with 24 additions and 47 deletions

View file

@ -210,7 +210,7 @@ public:
}
}
ThreadEventQueue::current().post_event(*strong_owner, make<TimerEvent>());
ThreadEventQueue::current().post_event(strong_owner, make<TimerEvent>());
}
AK::Duration interval;
@ -314,7 +314,7 @@ void EventLoopImplementationUnix::quit(int code)
m_exit_code = code;
}
void EventLoopImplementationUnix::post_event(EventReceiver& receiver, NonnullOwnPtr<Event>&& event)
void EventLoopImplementationUnix::post_event(EventReceiver* receiver, NonnullOwnPtr<Event>&& event)
{
m_thread_event_queue.post_event(receiver, move(event));
if (&m_thread_event_queue != &ThreadEventQueue::current())
@ -422,7 +422,7 @@ try_select_again:
type &= notifier.type();
if (type != NotificationType::None)
ThreadEventQueue::current().post_event(notifier, make<NotifierActivationEvent>());
ThreadEventQueue::current().post_event(&notifier, make<NotifierActivationEvent>());
#endif
}
}