diff options
author | Andreas Kling <kling@serenityos.org> | 2021-05-13 22:42:11 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-13 23:28:40 +0200 |
commit | dc25a4e2492b8ad4f4ba7179861b4ae96c07e9ca (patch) | |
tree | 1a9beb42ef0bec5cb09dcd2c04991d800eb6f338 /Userland/Libraries/LibCore | |
parent | 3d3a5b431f1836b6905e5ac2408389916b3e1ce1 (diff) | |
download | serenity-dc25a4e2492b8ad4f4ba7179861b4ae96c07e9ca.zip |
LibCore+Inspector: Reverse the direction of Inspector connections
Core::EventLoop now makes an outbound connection to InspectorServer
instead of listening for incoming connections on a /tmp/rpc/PID socket.
This has many benefits, for example:
- We no longer keep an open listening socket in most applications
- We stop leaking socket files in /tmp/rpc
- We can tighten the pledges in many programs (patch coming)
Diffstat (limited to 'Userland/Libraries/LibCore')
-rw-r--r-- | Userland/Libraries/LibCore/EventLoop.cpp | 43 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/EventLoop.h | 8 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/Object.cpp | 4 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/Object.h | 6 |
4 files changed, 32 insertions, 29 deletions
diff --git a/Userland/Libraries/LibCore/EventLoop.cpp b/Userland/Libraries/LibCore/EventLoop.cpp index 4226f02b05..0173a5b0d8 100644 --- a/Userland/Libraries/LibCore/EventLoop.cpp +++ b/Userland/Libraries/LibCore/EventLoop.cpp @@ -37,7 +37,9 @@ namespace Core { -class RPCClient; +class InspectorServerConnection; + +[[maybe_unused]] static bool connect_to_inspector_server(); struct EventLoopTimer { int timer_id { 0 }; @@ -61,8 +63,7 @@ static NeverDestroyed<IDAllocator> s_id_allocator; static HashMap<int, NonnullOwnPtr<EventLoopTimer>>* s_timers; static HashTable<Notifier*>* s_notifiers; int EventLoop::s_wake_pipe_fds[2]; -static RefPtr<LocalServer> s_rpc_server; -HashMap<int, RefPtr<RPCClient>> s_rpc_clients; +static RefPtr<InspectorServerConnection> s_inspector_server_connection; class SignalHandlers : public RefCounted<SignalHandlers> { AK_MAKE_NONCOPYABLE(SignalHandlers); @@ -120,15 +121,14 @@ inline SignalHandlersInfo* signals_info() pid_t EventLoop::s_pid; -class RPCClient : public Object { - C_OBJECT(RPCClient) +class InspectorServerConnection : public Object { + C_OBJECT(InspectorServerConnection) public: - explicit RPCClient(RefPtr<LocalSocket> socket) + explicit InspectorServerConnection(RefPtr<LocalSocket> socket) : m_socket(move(socket)) , m_client_id(s_id_allocator->allocate()) { #ifdef __serenity__ - s_rpc_clients.set(m_client_id, this); add_child(*m_socket); m_socket->on_ready_to_read = [this] { u32 length; @@ -154,7 +154,7 @@ public: warnln("RPC Client constructed outside serenity, this is very likely a bug!"); #endif } - virtual ~RPCClient() override + virtual ~InspectorServerConnection() override { if (auto inspected_object = m_inspected_object.strong_ref()) inspected_object->decrement_inspector_count({}); @@ -244,7 +244,6 @@ public: void shutdown() { - s_rpc_clients.remove(m_client_id); s_id_allocator->deallocate(m_client_id); } @@ -254,7 +253,7 @@ private: int m_client_id { -1 }; }; -EventLoop::EventLoop() +EventLoop::EventLoop([[maybe_unused]] MakeInspectable make_inspectable) : m_private(make<Private>()) { if (!s_event_loop_stack) { @@ -278,9 +277,11 @@ EventLoop::EventLoop() s_event_loop_stack->append(this); #ifdef __serenity__ - if (!s_rpc_server) { - if (!start_rpc_server()) - dbgln("Core::EventLoop: Failed to start an RPC server"); + if (make_inspectable == MakeInspectable::Yes) { + if (!s_inspector_server_connection) { + if (!connect_to_inspector_server()) + dbgln("Core::EventLoop: Failed to connect to InspectorServer"); + } } #endif } @@ -292,15 +293,14 @@ EventLoop::~EventLoop() { } -bool EventLoop::start_rpc_server() +bool connect_to_inspector_server() { #ifdef __serenity__ - s_rpc_server = LocalServer::construct(); - s_rpc_server->set_name("Core::EventLoop_RPC_server"); - s_rpc_server->on_ready_to_accept = [&] { - RPCClient::construct(s_rpc_server->accept()); - }; - return s_rpc_server->listen(String::formatted("/tmp/rpc/{}", getpid())); + auto socket = Core::LocalSocket::construct(); + if (!socket->connect(SocketAddress::local("/tmp/portal/inspectables"))) + return false; + s_inspector_server_connection = InspectorServerConnection::construct(move(socket)); + return true; #else VERIFY_NOT_REACHED(); #endif @@ -563,8 +563,7 @@ void EventLoop::notify_forked(ForkEvent event) } s_pid = 0; #ifdef __serenity__ - s_rpc_server = nullptr; - s_rpc_clients.clear(); + s_inspector_server_connection = nullptr; #endif return; } diff --git a/Userland/Libraries/LibCore/EventLoop.h b/Userland/Libraries/LibCore/EventLoop.h index a4c439d526..c47d963cf6 100644 --- a/Userland/Libraries/LibCore/EventLoop.h +++ b/Userland/Libraries/LibCore/EventLoop.h @@ -21,7 +21,12 @@ namespace Core { class EventLoop { public: - EventLoop(); + enum class MakeInspectable { + No, + Yes, + }; + + EventLoop(MakeInspectable = MakeInspectable::Yes); ~EventLoop(); int exec(); @@ -69,7 +74,6 @@ public: static void notify_forked(ForkEvent); private: - bool start_rpc_server(); void wait_for_event(WaitMode); Optional<struct timeval> get_next_timer_expiration(); static void dispatch_signal(int); diff --git a/Userland/Libraries/LibCore/Object.cpp b/Userland/Libraries/LibCore/Object.cpp index 4c316406fd..be147d73e0 100644 --- a/Userland/Libraries/LibCore/Object.cpp +++ b/Userland/Libraries/LibCore/Object.cpp @@ -226,14 +226,14 @@ bool Object::is_visible_for_timer_purposes() const return true; } -void Object::increment_inspector_count(Badge<RPCClient>) +void Object::increment_inspector_count(Badge<InspectorServerConnection>) { ++m_inspector_count; if (m_inspector_count == 1) did_begin_inspection(); } -void Object::decrement_inspector_count(Badge<RPCClient>) +void Object::decrement_inspector_count(Badge<InspectorServerConnection>) { --m_inspector_count; if (!m_inspector_count) diff --git a/Userland/Libraries/LibCore/Object.h b/Userland/Libraries/LibCore/Object.h index 046a1b894f..3de9495a5a 100644 --- a/Userland/Libraries/LibCore/Object.h +++ b/Userland/Libraries/LibCore/Object.h @@ -48,7 +48,7 @@ private: ObjectClassRegistration* m_parent_class { nullptr }; }; -class RPCClient; +class InspectorServerConnection; enum class TimerShouldFireWhenNotVisible { No = 0, @@ -155,8 +155,8 @@ public: bool is_being_inspected() const { return m_inspector_count; } - void increment_inspector_count(Badge<RPCClient>); - void decrement_inspector_count(Badge<RPCClient>); + void increment_inspector_count(Badge<InspectorServerConnection>); + void decrement_inspector_count(Badge<InspectorServerConnection>); virtual bool load_from_json(const JsonObject&, RefPtr<Core::Object> (*)(const String&)) { return false; } |