[MainLoop] Fix assertion failure
authorPavel Labath <labath@google.com>
Fri, 17 Jul 2015 10:08:38 +0000 (10:08 +0000)
committerPavel Labath <labath@google.com>
Fri, 17 Jul 2015 10:08:38 +0000 (10:08 +0000)
Upon connection termination the waitable handle of an IOObject gets reset to an invalid handle.
This caused a problem since we used the object->GetWaitableHandle as a key to the set of
registered events. The fix is to use something more immutable as a key: we make a copy of the
original waitable handle, instead of holding onto the IOObject.

llvm-svn: 242515

lldb/include/lldb/Host/MainLoopBase.h
lldb/include/lldb/Host/posix/MainLoopPosix.h
lldb/source/Host/posix/MainLoopPosix.cpp

index bff2ce7..da14349 100644 (file)
@@ -60,25 +60,25 @@ public:
 protected:
     ReadHandleUP
     CreateReadHandle(const lldb::IOObjectSP &object_sp)
-    { return ReadHandleUP(new ReadHandle(*this, object_sp)); }
+    { return ReadHandleUP(new ReadHandle(*this, object_sp->GetWaitableHandle())); }
 
     virtual void
-    UnregisterReadObject(const lldb::IOObjectSP &object_sp)
+    UnregisterReadObject(IOObject::WaitableHandle handle)
     { llvm_unreachable("Not implemented"); }
 
 private:
     class ReadHandle
     {
     public:
-        ~ReadHandle() { m_mainloop.UnregisterReadObject(m_object_sp); }
+        ~ReadHandle() { m_mainloop.UnregisterReadObject(m_handle); }
 
     private:
-        ReadHandle(MainLoopBase &mainloop, const lldb::IOObjectSP &object_sp)
-            : m_mainloop(mainloop), m_object_sp(object_sp)
+        ReadHandle(MainLoopBase &mainloop, IOObject::WaitableHandle handle)
+            : m_mainloop(mainloop), m_handle(handle)
         { }
 
         MainLoopBase &m_mainloop;
-        lldb::IOObjectSP m_object_sp;
+        IOObject::WaitableHandle m_handle;
 
         friend class MainLoopBase;
         DISALLOW_COPY_AND_ASSIGN(ReadHandle);
index 9a665de..225cebd 100644 (file)
@@ -60,7 +60,7 @@ public:
 
 protected:
     void
-    UnregisterReadObject(const lldb::IOObjectSP &object_sp) override;
+    UnregisterReadObject(IOObject::WaitableHandle handle) override;
 
     void
     UnregisterSignal(int signo);
index cb213b9..dccd7fa 100644 (file)
@@ -94,9 +94,9 @@ MainLoopPosix::RegisterSignal(int signo, const Callback &callback, Error &error)
 }
 
 void
-MainLoopPosix::UnregisterReadObject(const lldb::IOObjectSP &object_sp)
+MainLoopPosix::UnregisterReadObject(IOObject::WaitableHandle handle)
 {
-    bool erased = m_read_fds.erase(object_sp->GetWaitableHandle());
+    bool erased = m_read_fds.erase(handle);
     (void) erased;
     assert(erased);
 }