From b51fde39a282a555b9ad6fc156ab38c0db0d9e1d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 4 Jun 2026 19:56:43 +0200 Subject: [PATCH] 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. --- Services/Compositor/CompositorState.cpp | 9 +++------ Services/Compositor/VSyncScheduler.cpp | 18 +++++++----------- Services/WebDriver/Session.cpp | 10 +++------- Services/WebDriver/Session.h | 2 +- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/Services/Compositor/CompositorState.cpp b/Services/Compositor/CompositorState.cpp index 270b26c7db..0a21bc7c78 100644 --- a/Services/Compositor/CompositorState.cpp +++ b/Services/Compositor/CompositorState.cpp @@ -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); }); }); diff --git a/Services/Compositor/VSyncScheduler.cpp b/Services/Compositor/VSyncScheduler.cpp index 6b1fcb351a..c928015dd2 100644 --- a/Services/Compositor/VSyncScheduler.cpp +++ b/Services/Compositor/VSyncScheduler.cpp @@ -76,7 +76,7 @@ static CVReturn display_link_callback(CVDisplayLinkRef, CVTimeStamp const*, CVTi class DisplayLinkState final : public AtomicRefCounted { public: - static RefPtr create(u64 display_id, NonnullRefPtr event_loop, Function&& tick_callback) + static RefPtr create(u64 display_id, Core::EventLoop& event_loop, Function&& 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 event_loop; + Core::EventLoop& event_loop; Function tick_callback; Atomic invalidated { false }; Atomic tick_requested { false }; @@ -122,8 +122,8 @@ public: NonnullRefPtr idle_stop_timer; private: - DisplayLinkState(NonnullRefPtr 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 try_create(u64 display_id, Function&& 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(); diff --git a/Services/WebDriver/Session.cpp b/Services/WebDriver/Session.cpp index c8b230284a..22b1cb6a45 100644 --- a/Services/WebDriver/Session.cpp +++ b/Services/WebDriver/Session.cpp @@ -128,7 +128,7 @@ Session::Session(NonnullRefPtr 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 Session::create_server(NonnullRefPtr 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 Session::create_server(NonnullRefPtr 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(move(transport.receive_right), move(transport.send_right)), promise); result.is_error()) promise->resolve(result.release_error()); }); diff --git a/Services/WebDriver/Session.h b/Services/WebDriver/Session.h index a72b794db2..72615d31a9 100644 --- a/Services/WebDriver/Session.h +++ b/Services/WebDriver/Session.h @@ -112,7 +112,7 @@ private: ByteString m_web_content_endpoint; Optional m_browser_process; - NonnullRefPtr m_event_loop; + Core::EventLoop& m_event_loop; #if defined(AK_OS_MACOS) OwnPtr m_web_content_mach_port_server;