[MainLoop] Fix assertion failure
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
This commit is contained in:
parent
65bc306345
commit
f3898c30e6
|
@ -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);
|
||||
|
|
|
@ -60,7 +60,7 @@ public:
|
|||
|
||||
protected:
|
||||
void
|
||||
UnregisterReadObject(const lldb::IOObjectSP &object_sp) override;
|
||||
UnregisterReadObject(IOObject::WaitableHandle handle) override;
|
||||
|
||||
void
|
||||
UnregisterSignal(int signo);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue