make sure events are enabled in DoWait() before starting to wait for them (closes #10396)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58250 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-01-20 23:53:35 +00:00
parent 592883ed7e
commit 5ab2f2575d

View File

@@ -1328,6 +1328,20 @@ wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags)
eventLoop = NULL; eventLoop = NULL;
} }
// Make sure the events we're interested in are enabled before waiting for
// them: this is really necessary here as otherwise this could happen:
// 1. DoRead(wxSOCKET_WAITALL) is called
// 2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called
// 3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting()
// is called and wxSOCKET_INPUT_FLAG events are disabled in it
// 4. Because of wxSOCKET_WAITALL we call DoWait() again but the events
// are still disabled and we block forever
//
// More elegant solution would be nice but for now simply re-enabling the
// events here will do
m_impl->ReenableEvents(flags & (wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG));
// Wait until we receive the event we're waiting for or the timeout expires // Wait until we receive the event we're waiting for or the timeout expires
// (but note that we always execute the loop at least once, even if timeout // (but note that we always execute the loop at least once, even if timeout
// is 0 as this is used for polling) // is 0 as this is used for polling)