summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibCore
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-05-13 22:42:11 +0200
committerAndreas Kling <kling@serenityos.org>2021-05-13 23:28:40 +0200
commitdc25a4e2492b8ad4f4ba7179861b4ae96c07e9ca (patch)
tree1a9beb42ef0bec5cb09dcd2c04991d800eb6f338 /Userland/Libraries/LibCore
parent3d3a5b431f1836b6905e5ac2408389916b3e1ce1 (diff)
downloadserenity-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.cpp43
-rw-r--r--Userland/Libraries/LibCore/EventLoop.h8
-rw-r--r--Userland/Libraries/LibCore/Object.cpp4
-rw-r--r--Userland/Libraries/LibCore/Object.h6
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; }