Services: Use direct references to main event loops

Store direct Core::EventLoop references in WebDriver and the
Compositor when callbacks post back to the process main loop. The
main event loop is intentionally kept alive for the lifetime of these
services, so these paths no longer need WeakEventLoopReference guards.
This commit is contained in:
Andreas Kling 2026-06-04 19:56:43 +02:00 committed by Andreas Kling
parent 83b293e4f2
commit b51fde39a2
4 changed files with 14 additions and 25 deletions

View file

@ -284,13 +284,10 @@ void CompositorState::present_frame(Web::Compositor::CompositorContextId context
m_pending_async_presents.append(context_id, viewport_rect, prepared_frame->bitmap_id);
auto* pending_present = &m_pending_async_presents.last();
auto event_loop_reference = Core::EventLoop::current_weak();
auto& event_loop = Core::EventLoop::current();
auto self = NonnullRefPtr { *this };
m_display_list_player->flush_async(*prepared_frame->rendered_surface, [self = move(self), event_loop_reference = move(event_loop_reference), pending_present] {
auto event_loop = event_loop_reference->take();
if (!event_loop.is_alive())
return;
event_loop->deferred_invoke([self = move(self), pending_present] {
m_display_list_player->flush_async(*prepared_frame->rendered_surface, [self = move(self), &event_loop, pending_present] {
event_loop.deferred_invoke([self = move(self), pending_present] {
self->did_finish_async_present(*pending_present);
});
});

View file

@ -76,7 +76,7 @@ static CVReturn display_link_callback(CVDisplayLinkRef, CVTimeStamp const*, CVTi
class DisplayLinkState final : public AtomicRefCounted<DisplayLinkState> {
public:
static RefPtr<DisplayLinkState> create(u64 display_id, NonnullRefPtr<Core::WeakEventLoopReference> event_loop, Function<void()>&& tick_callback)
static RefPtr<DisplayLinkState> create(u64 display_id, Core::EventLoop& event_loop, Function<void()>&& tick_callback)
{
CVDisplayLinkRef display_link = nullptr;
@ -88,7 +88,7 @@ public:
if (result != kCVReturnSuccess || !display_link)
return nullptr;
auto state = adopt_ref(*new DisplayLinkState(move(event_loop), display_link));
auto state = adopt_ref(*new DisplayLinkState(event_loop, display_link));
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
@ -114,7 +114,7 @@ public:
bool consume_tick_request();
bool is_valid() const;
NonnullRefPtr<Core::WeakEventLoopReference> event_loop;
Core::EventLoop& event_loop;
Function<void()> tick_callback;
Atomic<bool> invalidated { false };
Atomic<bool> tick_requested { false };
@ -122,8 +122,8 @@ public:
NonnullRefPtr<Core::Timer> idle_stop_timer;
private:
DisplayLinkState(NonnullRefPtr<Core::WeakEventLoopReference> event_loop, CVDisplayLinkRef display_link)
: event_loop(move(event_loop))
DisplayLinkState(Core::EventLoop& event_loop, CVDisplayLinkRef display_link)
: event_loop(event_loop)
, display_link(display_link)
, idle_stop_timer(Core::Timer::create_single_shot(display_link_idle_stop_delay_ms, [this] {
stop_display_link_if_idle();
@ -217,7 +217,7 @@ class CVDisplayLinkVSyncScheduler final : public VSyncScheduler {
public:
static OwnPtr<CVDisplayLinkVSyncScheduler> try_create(u64 display_id, Function<void()>&& tick_callback)
{
auto state = DisplayLinkState::create(display_id, Core::EventLoop::current_weak(), move(tick_callback));
auto state = DisplayLinkState::create(display_id, Core::EventLoop::current(), move(tick_callback));
if (!state)
return nullptr;
return adopt_own(*new CVDisplayLinkVSyncScheduler(state.release_nonnull()));
@ -248,11 +248,7 @@ static CVReturn display_link_callback(CVDisplayLinkRef, CVTimeStamp const*, CVTi
if (!state->consume_tick_request())
return kCVReturnSuccess;
auto event_loop = state->event_loop->take();
if (!event_loop.is_alive())
return kCVReturnSuccess;
event_loop->deferred_invoke([state = move(state)] {
state->event_loop.deferred_invoke([state = move(state)] {
if (!state->is_valid())
return;
state->tick_callback();

View file

@ -128,7 +128,7 @@ Session::Session(NonnullRefPtr<Client> client, JsonObject const& capabilities, S
, m_options(capabilities)
, m_session_id(move(session_id))
, m_session_flags(flags)
, m_event_loop(Core::EventLoop::current_weak())
, m_event_loop(Core::EventLoop::current())
{
}
@ -278,9 +278,7 @@ ErrorOr<void> Session::create_server(NonnullRefPtr<ServerPromise> promise)
m_web_content_mach_port_server->on_bootstrap_request = [this, promise](auto request) {
auto result = m_transport_bootstrap_server.handle_bootstrap_request(request.pid, move(request.reply_port));
if (result.is_error()) {
auto event_loop = m_event_loop->take();
VERIFY(event_loop);
event_loop->deferred_invoke([promise, error = result.release_error()]() mutable {
m_event_loop.deferred_invoke([promise, error = result.release_error()]() mutable {
promise->resolve(move(error));
});
return;
@ -291,9 +289,7 @@ ErrorOr<void> Session::create_server(NonnullRefPtr<ServerPromise> promise)
VERIFY_NOT_REACHED();
},
[this, promise](IPC::TransportBootstrapMachServer::OnDemandTransport& transport) {
auto event_loop = m_event_loop->take();
VERIFY(event_loop);
event_loop->deferred_invoke([this, promise, transport = move(transport.ports)]() mutable {
m_event_loop.deferred_invoke([this, promise, transport = move(transport.ports)]() mutable {
if (auto result = accept_web_content_transport(make<IPC::Transport>(move(transport.receive_right), move(transport.send_right)), promise); result.is_error())
promise->resolve(result.release_error());
});

View file

@ -112,7 +112,7 @@ private:
ByteString m_web_content_endpoint;
Optional<Core::Process> m_browser_process;
NonnullRefPtr<Core::WeakEventLoopReference> m_event_loop;
Core::EventLoop& m_event_loop;
#if defined(AK_OS_MACOS)
OwnPtr<IPC::MachBootstrapListener> m_web_content_mach_port_server;