LibCore: Remove main event loop
The main event loop functionality was used in just two places where the alternative is a bit simpler. Remove it in favor of referencing the event loop directly, or just invoking `EventLoop::current()`. Note that we don't need locking in the constructor since we're now only modifying a thread-local `Vector`. We also don't need locking in the old call sites to `::with_main_locked()` since we already lock the event loop in the subsequent `::post_event()` invocation.
This commit is contained in:
parent
9e2a619fdc
commit
f25123df66
Notes:
sideshowbarker
2024-07-17 11:30:10 +09:00
Author: https://github.com/gmta Commit: https://github.com/SerenityOS/serenity/commit/f25123df66 Pull-request: https://github.com/SerenityOS/serenity/pull/13784 Reviewed-by: https://github.com/linusg
4 changed files with 21 additions and 46 deletions
|
@ -298,12 +298,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
size_t thread_index = 0;
|
size_t thread_index = 0;
|
||||||
coredump->for_each_thread_info([&](auto& thread_info) {
|
coredump->for_each_thread_info([&](auto& thread_info) {
|
||||||
results.thread_backtraces.append(build_backtrace(*coredump, thread_info, thread_index, [&](size_t frame_index, size_t frame_count) {
|
results.thread_backtraces.append(build_backtrace(*coredump, thread_info, thread_index, [&](size_t frame_index, size_t frame_count) {
|
||||||
Core::EventLoop::with_main_locked([&](auto& main) {
|
app->event_loop().deferred_invoke([&, frame_index, frame_count] {
|
||||||
main->deferred_invoke([&, frame_index, frame_count] {
|
window->set_progress(100.0f * (float)(frame_index + 1) / (float)frame_count);
|
||||||
window->set_progress(100.0f * (float)(frame_index + 1) / (float)frame_count);
|
progressbar.set_value(frame_index + 1);
|
||||||
progressbar.set_value(frame_index + 1);
|
progressbar.set_max(frame_count);
|
||||||
progressbar.set_max(frame_count);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
results.thread_cpu_registers.append(build_cpu_registers(thread_info, thread_index));
|
results.thread_cpu_registers.append(build_cpu_registers(thread_info, thread_index));
|
||||||
|
|
|
@ -123,7 +123,7 @@ void ThreadStackWidget::refresh()
|
||||||
[weak_this = make_weak_ptr()](auto result) {
|
[weak_this = make_weak_ptr()](auto result) {
|
||||||
if (!weak_this)
|
if (!weak_this)
|
||||||
return;
|
return;
|
||||||
Core::EventLoop::with_main_locked([&](auto* main_event_loop) { main_event_loop->post_event(const_cast<Core::Object&>(*weak_this), make<CompletionEvent>(move(result))); });
|
Core::EventLoop::current().post_event(const_cast<Core::Object&>(*weak_this), make<CompletionEvent>(move(result)));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,8 +61,6 @@ struct EventLoop::Private {
|
||||||
Threading::Mutex lock;
|
Threading::Mutex lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
// The main event loop is global to the program, so it may be accessed from multiple threads.
|
|
||||||
Threading::MutexProtected<EventLoop*> s_main_event_loop;
|
|
||||||
static Threading::MutexProtected<NeverDestroyed<IDAllocator>> s_id_allocator;
|
static Threading::MutexProtected<NeverDestroyed<IDAllocator>> s_id_allocator;
|
||||||
static Threading::MutexProtected<RefPtr<InspectorServerConnection>> s_inspector_server_connection;
|
static Threading::MutexProtected<RefPtr<InspectorServerConnection>> s_inspector_server_connection;
|
||||||
|
|
||||||
|
@ -323,27 +321,25 @@ EventLoop::EventLoop([[maybe_unused]] MakeInspectable make_inspectable)
|
||||||
s_timers = new HashMap<int, NonnullOwnPtr<EventLoopTimer>>;
|
s_timers = new HashMap<int, NonnullOwnPtr<EventLoopTimer>>;
|
||||||
s_notifiers = new HashTable<Notifier*>;
|
s_notifiers = new HashTable<Notifier*>;
|
||||||
}
|
}
|
||||||
s_main_event_loop.with_locked([&, this](auto*& main_event_loop) {
|
|
||||||
if (main_event_loop == nullptr) {
|
if (s_event_loop_stack->is_empty()) {
|
||||||
main_event_loop = this;
|
s_pid = getpid();
|
||||||
s_pid = getpid();
|
s_event_loop_stack->append(*this);
|
||||||
s_event_loop_stack->append(*this);
|
|
||||||
|
|
||||||
#ifdef __serenity__
|
#ifdef __serenity__
|
||||||
if (getuid() != 0) {
|
if (getuid() != 0) {
|
||||||
if (getenv("MAKE_INSPECTABLE") == "1"sv)
|
if (getenv("MAKE_INSPECTABLE") == "1"sv)
|
||||||
make_inspectable = Core::EventLoop::MakeInspectable::Yes;
|
make_inspectable = Core::EventLoop::MakeInspectable::Yes;
|
||||||
|
|
||||||
if (make_inspectable == MakeInspectable::Yes
|
if (make_inspectable == MakeInspectable::Yes
|
||||||
// FIXME: Deadlock potential; though the main loop and inspector server connection are rarely used in conjunction
|
// FIXME: Deadlock potential; though the main loop and inspector server connection are rarely used in conjunction
|
||||||
&& !s_inspector_server_connection.with_locked([](auto inspector_server_connection) { return inspector_server_connection; })) {
|
&& !s_inspector_server_connection.with_locked([](auto inspector_server_connection) { return inspector_server_connection; })) {
|
||||||
if (!connect_to_inspector_server())
|
if (!connect_to_inspector_server())
|
||||||
dbgln("Core::EventLoop: Failed to connect to InspectorServer");
|
dbgln("Core::EventLoop: Failed to connect to InspectorServer");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
});
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
initialize_wake_pipes();
|
initialize_wake_pipes();
|
||||||
|
|
||||||
|
@ -352,13 +348,8 @@ EventLoop::EventLoop([[maybe_unused]] MakeInspectable make_inspectable)
|
||||||
|
|
||||||
EventLoop::~EventLoop()
|
EventLoop::~EventLoop()
|
||||||
{
|
{
|
||||||
// NOTE: Pop the main event loop off of the stack when destroyed.
|
if (!s_event_loop_stack->is_empty() && &s_event_loop_stack->last() == this)
|
||||||
s_main_event_loop.with_locked([this](auto*& main_event_loop) {
|
s_event_loop_stack->take_last();
|
||||||
if (this == main_event_loop) {
|
|
||||||
s_event_loop_stack->take_last();
|
|
||||||
main_event_loop = nullptr;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool connect_to_inspector_server()
|
bool connect_to_inspector_server()
|
||||||
|
@ -639,7 +630,6 @@ void EventLoop::notify_forked(ForkEvent event)
|
||||||
VERIFY_EVENT_LOOP_INITIALIZED();
|
VERIFY_EVENT_LOOP_INITIALIZED();
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ForkEvent::Child:
|
case ForkEvent::Child:
|
||||||
s_main_event_loop.with_locked([]([[maybe_unused]] auto*& main_event_loop) { main_event_loop = nullptr; });
|
|
||||||
s_event_loop_stack->clear();
|
s_event_loop_stack->clear();
|
||||||
s_timers->clear();
|
s_timers->clear();
|
||||||
s_notifiers->clear();
|
s_notifiers->clear();
|
||||||
|
@ -650,9 +640,6 @@ void EventLoop::notify_forked(ForkEvent event)
|
||||||
info->next_signal_id = 0;
|
info->next_signal_id = 0;
|
||||||
}
|
}
|
||||||
s_pid = 0;
|
s_pid = 0;
|
||||||
#ifdef __serenity__
|
|
||||||
s_main_event_loop.with_locked([]([[maybe_unused]] auto*& main_event_loop) { main_event_loop = nullptr; });
|
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,6 @@
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
extern Threading::MutexProtected<EventLoop*> s_main_event_loop;
|
|
||||||
|
|
||||||
class EventLoop {
|
class EventLoop {
|
||||||
public:
|
public:
|
||||||
enum class MakeInspectable {
|
enum class MakeInspectable {
|
||||||
|
@ -59,14 +57,6 @@ public:
|
||||||
|
|
||||||
void post_event(Object& receiver, NonnullOwnPtr<Event>&&, ShouldWake = ShouldWake::No);
|
void post_event(Object& receiver, NonnullOwnPtr<Event>&&, ShouldWake = ShouldWake::No);
|
||||||
|
|
||||||
template<typename Callback>
|
|
||||||
static decltype(auto) with_main_locked(Callback callback)
|
|
||||||
{
|
|
||||||
return s_main_event_loop.with_locked([&callback](auto*& event_loop) {
|
|
||||||
VERIFY(event_loop != nullptr);
|
|
||||||
return callback(event_loop);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
static EventLoop& current();
|
static EventLoop& current();
|
||||||
|
|
||||||
bool was_exit_requested() const { return m_exit_requested; }
|
bool was_exit_requested() const { return m_exit_requested; }
|
||||||
|
|
Loading…
Add table
Reference in a new issue