diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-08-17 11:35:09 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-08-17 11:39:26 +0200 |
commit | 1febd59f830d0c5ee240b73c7fd376c18f76f754 (patch) | |
tree | 16ad6282ca0b0a525546b0cc7bd6413b7b60fc15 /Libraries/LibCore | |
parent | 2fa2d72761d4cbe3b7b305bbd0205e5b05fe4899 (diff) | |
download | serenity-1febd59f830d0c5ee240b73c7fd376c18f76f754.zip |
LibCore+rpcdump: Publish CObject graph to on-demand RPC socket
All programs that have a CEventLoop now allow local socket connections
via /tmp/rpc.PID and will dump a serialized JSON array of all the live
CObjects in the program onto connecting sockets.
Also added a small /bin/rpcdump tool that connects to an RPC socket and
produces a raw dump of the JSON that comes out.
Diffstat (limited to 'Libraries/LibCore')
-rw-r--r-- | Libraries/LibCore/CEventLoop.cpp | 31 | ||||
-rw-r--r-- | Libraries/LibCore/CEventLoop.h | 5 |
2 files changed, 35 insertions, 1 deletions
diff --git a/Libraries/LibCore/CEventLoop.cpp b/Libraries/LibCore/CEventLoop.cpp index 2e50891b15..26adf6fd77 100644 --- a/Libraries/LibCore/CEventLoop.cpp +++ b/Libraries/LibCore/CEventLoop.cpp @@ -1,6 +1,10 @@ +#include <AK/JsonArray.h> +#include <AK/JsonObject.h> +#include <AK/JsonValue.h> #include <AK/Time.h> #include <LibCore/CEvent.h> #include <LibCore/CEventLoop.h> +#include <LibCore/CLocalSocket.h> #include <LibCore/CLock.h> #include <LibCore/CNotifier.h> #include <LibCore/CObject.h> @@ -25,6 +29,7 @@ HashMap<int, NonnullOwnPtr<CEventLoop::EventLoopTimer>>* CEventLoop::s_timers; HashTable<CNotifier*>* CEventLoop::s_notifiers; int CEventLoop::s_next_timer_id = 1; int CEventLoop::s_wake_pipe_fds[2]; +CLocalServer CEventLoop::s_rpc_server; CEventLoop::CEventLoop() { @@ -39,6 +44,32 @@ CEventLoop::CEventLoop() int rc = pipe2(s_wake_pipe_fds, O_CLOEXEC); ASSERT(rc == 0); s_event_loop_stack->append(this); + + + auto rpc_path = String::format("/tmp/rpc.%d", getpid()); + rc = unlink(rpc_path.characters()); + if (rc < 0 && errno != ENOENT) { + perror("unlink"); + ASSERT_NOT_REACHED(); + } + bool listening = s_rpc_server.listen(rpc_path); + ASSERT(listening); + + s_rpc_server.on_ready_to_accept = [&] { + auto* client = s_rpc_server.accept(); + ASSERT(client); + JsonArray objects; + for (auto& object : CObject::all_objects()) { + JsonObject json_object; + json_object.set("class_name", object.class_name()); + json_object.set("address", String::format("%p", &object)); + json_object.set("name", object.name()); + json_object.set("parent", String::format("%p", object.parent())); + objects.append(move(json_object)); + } + client->write(objects.to_string()); + client->delete_later(); + }; } #ifdef CEVENTLOOP_DEBUG diff --git a/Libraries/LibCore/CEventLoop.h b/Libraries/LibCore/CEventLoop.h index 41cb35bc36..aa7777b768 100644 --- a/Libraries/LibCore/CEventLoop.h +++ b/Libraries/LibCore/CEventLoop.h @@ -5,8 +5,9 @@ #include <AK/OwnPtr.h> #include <AK/Vector.h> #include <AK/WeakPtr.h> -#include <LibCore/CLock.h> #include <LibCore/CEvent.h> +#include <LibCore/CLocalServer.h> +#include <LibCore/CLock.h> #include <sys/select.h> #include <sys/time.h> #include <time.h> @@ -85,4 +86,6 @@ private: static int s_next_timer_id; static HashTable<CNotifier*>* s_notifiers; + + static CLocalServer s_rpc_server; }; |