ladybird/Libraries/LibCore/ThreadEventQueue.h
Zaggy1024 b572ae95a9 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.
2025-12-02 21:21:03 -06:00

46 lines
1.2 KiB
C++

/*
* Copyright (c) 2023, Andreas Kling <andreas@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/NonnullOwnPtr.h>
#include <AK/OwnPtr.h>
#include <LibCore/Forward.h>
namespace Core {
// Per-thread global event queue. This is where events are queued for the EventLoop to process.
// There is only one ThreadEventQueue per thread, and it is accessed via ThreadEventQueue::current().
// It is allowed to post events to other threads' event queues.
class ThreadEventQueue {
AK_MAKE_NONCOPYABLE(ThreadEventQueue);
AK_MAKE_NONMOVABLE(ThreadEventQueue);
public:
static ThreadEventQueue& current();
// Process all queued events. Returns the number of events that were processed.
size_t process();
// Posts an event to the event queue.
void post_event(EventReceiver*, NonnullOwnPtr<Event>);
// Used by Threading::BackgroundAction.
void add_job(NonnullRefPtr<Promise<NonnullRefPtr<EventReceiver>>>);
void cancel_all_pending_jobs();
// Returns true if there are events waiting to be flushed.
bool has_pending_events() const;
private:
ThreadEventQueue();
~ThreadEventQueue();
struct Private;
OwnPtr<Private> m_private;
};
}