[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:
Pavel Labath 2015-07-17 10:08:38 +00:00
parent 65bc306345
commit f3898c30e6
3 changed files with 9 additions and 9 deletions

View 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);

View File

@ -60,7 +60,7 @@ public:
protected:
void
UnregisterReadObject(const lldb::IOObjectSP &object_sp) override;
UnregisterReadObject(IOObject::WaitableHandle handle) override;
void
UnregisterSignal(int signo);

View 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);
}