1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 04:17:35 +00:00

LibIPC: Allow overriding the use of deferred_invoke()

This will allow Ladybird to use IPC::Connection without having an
actively running Core::EventLoop.

The abstraction here is not great, and we should think of something
nicer, but we have to start somewhere.
This commit is contained in:
Andreas Kling 2022-10-05 20:09:55 +02:00
parent f877782117
commit b5681992e1
2 changed files with 33 additions and 6 deletions

View file

@ -12,14 +12,29 @@
namespace IPC {
struct CoreEventLoopDeferredInvoker final : public DeferredInvoker {
virtual ~CoreEventLoopDeferredInvoker() = default;
virtual void schedule(Function<void()> callback) override
{
Core::deferred_invoke(move(callback));
}
};
ConnectionBase::ConnectionBase(IPC::Stub& local_stub, NonnullOwnPtr<Core::Stream::LocalSocket> socket, u32 local_endpoint_magic)
: m_local_stub(local_stub)
, m_socket(move(socket))
, m_local_endpoint_magic(local_endpoint_magic)
, m_deferred_invoker(make<CoreEventLoopDeferredInvoker>())
{
m_responsiveness_timer = Core::Timer::create_single_shot(3000, [this] { may_have_become_unresponsive(); });
}
void ConnectionBase::set_deferred_invoker(NonnullOwnPtr<DeferredInvoker> deferred_invoker)
{
m_deferred_invoker = move(deferred_invoker);
}
void ConnectionBase::set_fd_passing_socket(NonnullOwnPtr<Core::Stream::LocalSocket> socket)
{
m_fd_passing_socket = move(socket);
@ -157,7 +172,9 @@ ErrorOr<Vector<u8>> ConnectionBase::read_as_much_as_possible_from_socket_without
auto bytes_read = maybe_bytes_read.release_value();
if (bytes_read.is_empty()) {
deferred_invoke([this] { shutdown(); });
m_deferred_invoker->schedule([strong_this = NonnullRefPtr(*this)]() mutable {
strong_this->shutdown();
});
if (!bytes.is_empty())
break;
return Error::from_string_literal("IPC connection EOF");
@ -194,8 +211,8 @@ ErrorOr<void> ConnectionBase::drain_messages_from_peer()
}
if (!m_unprocessed_messages.is_empty()) {
deferred_invoke([this] {
handle_messages();
m_deferred_invoker->schedule([strong_this = NonnullRefPtr(*this)]() mutable {
strong_this->handle_messages();
});
}
return {};