1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-08 05:27:14 +09:00
ladybird/Libraries/LibWeb/Platform/EventLoopPluginSerenity.cpp
Andrew Kaster edfaa76c90 LibWeb: Exit the current process when event loop quits during spin_until
This is a LibWeb special. We keep running into cases where we end up
with one or more Platform or event loop spin_until() calls on the stack
after the event loop has been cancelled and the WebContent process has
been asked to exit.

To prevent too much nonsense from exiting processes early from affecting
our other, more well-behaved processes, put this special logic in the
critical path of such Web-specific event loop spins.
2025-04-30 11:12:23 -04:00

43 lines
1.1 KiB
C++

/*
* Copyright (c) 2022, Andreas Kling <andreas@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "EventLoopPluginSerenity.h"
#include <AK/NonnullRefPtr.h>
#include <LibCore/EventLoop.h>
#include <LibWeb/Platform/TimerSerenity.h>
namespace Web::Platform {
EventLoopPluginSerenity::EventLoopPluginSerenity() = default;
EventLoopPluginSerenity::~EventLoopPluginSerenity() = default;
void EventLoopPluginSerenity::spin_until(GC::Root<GC::Function<bool()>> goal_condition)
{
Core::EventLoop::current().spin_until([goal_condition = move(goal_condition)]() {
if (Core::EventLoop::current().was_exit_requested())
::exit(0);
return goal_condition->function()();
});
}
void EventLoopPluginSerenity::deferred_invoke(GC::Root<GC::Function<void()>> function)
{
Core::deferred_invoke([function = move(function)]() {
function->function()();
});
}
GC::Ref<Timer> EventLoopPluginSerenity::create_timer(GC::Heap& heap)
{
return TimerSerenity::create(heap);
}
void EventLoopPluginSerenity::quit()
{
Core::EventLoop::current().quit(0);
}
}