[Lldb-commits] [lldb] [lldb] Refactor JSONTransport own MainLoop read handle. (PR #179564)

John Harrison via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 5 10:13:01 PST 2026


================
@@ -182,29 +181,27 @@ template <typename Proto> class IOTransport : public JSONTransport<Proto> {
   using Message = typename JSONTransport<Proto>::Message;
   using MessageHandler = typename JSONTransport<Proto>::MessageHandler;
 
-  IOTransport(lldb::IOObjectSP in, lldb::IOObjectSP out)
-      : m_in(in), m_out(out) {}
+  IOTransport(MainLoop &loop, lldb::IOObjectSP in, lldb::IOObjectSP out)
+      : m_loop(loop), m_in(in), m_out(out) {}
 
   llvm::Error Send(const typename Proto::Evt &evt) override {
     return Write(evt);
   }
+
   llvm::Error Send(const typename Proto::Req &req) override {
     return Write(req);
   }
+
   llvm::Error Send(const typename Proto::Resp &resp) override {
     return Write(resp);
   }
 
-  llvm::Expected<MainLoop::ReadHandleUP>
-  RegisterMessageHandler(MainLoop &loop, MessageHandler &handler) override {
+  llvm::Error RegisterMessageHandler(MessageHandler &handler) override {
     Status status;
-    MainLoop::ReadHandleUP read_handle = loop.RegisterReadObject(
+    m_read_handle = m_loop.RegisterReadObject(
         m_in, [this, &handler](MainLoopBase &base) { OnRead(base, handler); },
         status);
-    if (status.Fail()) {
-      return status.takeError();
-    }
-    return read_handle;
+    return status.takeError();
   }
 
----------------
ashgti wrote:

The reason I keep it around is to ensure the MainLoop out lives the JSONTransport object. If we took a pointer or if we only call `RegisterReadObject` from `RegisterMessageHandler` we can end up with a transport out living the MainLoop which caused some crashes for me in the unit tests.

https://github.com/llvm/llvm-project/pull/179564


More information about the lldb-commits mailing list