we don't need to use select() in DoWait() if we're receiving notifications about changes on our socket anyhow, this makes the code less efficient and, most importantly, much more confusing than necessary

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57566 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-26 14:39:04 +00:00
parent 5c1193e090
commit 2f1c8faf2c

View File

@@ -1247,19 +1247,35 @@ wxSocketBase::DoWait(long seconds, long milliseconds, wxSocketEventFlags flags)
eventLoop = NULL; eventLoop = NULL;
} }
// reset them before starting to wait
m_eventsgot = 0;
// Wait in an active polling loop: notice that the loop is executed at // Wait in an active polling loop: notice that the loop is executed at
// least once, even if timeout is 0 (i.e. polling). // least once, even if timeout is 0 (i.e. polling).
bool gotEvent = false; bool gotEvent = false;
for ( ;; ) for ( ;; )
{
wxSocketEventFlags events;
if ( eventLoop )
{
// This function is only called if wxSOCKET_BLOCK flag was not used
// and so we should dispatch the events if there is an event loop
// capable of doing it.
if ( eventLoop->Pending() )
eventLoop->Dispatch();
events = m_eventsgot;
}
else
{ {
// We always stop waiting when the connection is lost as it doesn't // We always stop waiting when the connection is lost as it doesn't
// make sense to continue further, even if wxSOCKET_LOST_FLAG is not // make sense to continue further, even if wxSOCKET_LOST_FLAG is
// specified in flags to wait for. // not specified in flags to wait for.
const wxSocketEventFlags events = m_impl->Select(flags | wxSOCKET_LOST_FLAG);
result = m_impl->Select(flags | wxSOCKET_LOST_FLAG); }
// Incoming connection (server) or connection established (client)? // Incoming connection (server) or connection established (client)?
if ( result & wxSOCKET_CONNECTION_FLAG ) if ( events & wxSOCKET_CONNECTION_FLAG )
{ {
m_connected = true; m_connected = true;
m_establishing = false; m_establishing = false;
@@ -1268,14 +1284,14 @@ wxSocketBase::DoWait(long seconds, long milliseconds, wxSocketEventFlags flags)
} }
// Data available or output buffer ready? // Data available or output buffer ready?
if ( (result & wxSOCKET_INPUT_FLAG) || (result & wxSOCKET_OUTPUT_FLAG) ) if ( (events & wxSOCKET_INPUT_FLAG) || (events & wxSOCKET_OUTPUT_FLAG) )
{ {
gotEvent = true; gotEvent = true;
break; break;
} }
// Connection lost // Connection lost
if ( result & wxSOCKET_LOST_FLAG ) if ( events & wxSOCKET_LOST_FLAG )
{ {
m_connected = false; m_connected = false;
m_establishing = false; m_establishing = false;
@@ -1292,16 +1308,9 @@ wxSocketBase::DoWait(long seconds, long milliseconds, wxSocketEventFlags flags)
if ( timeNow >= timeEnd ) if ( timeNow >= timeEnd )
break; break;
if ( eventLoop )
{
// This function is only called if wxSOCKET_BLOCK flag was not used
// and so we should dispatch the events if there is an event loop
// capable of doing it.
if ( eventLoop->Pending() )
eventLoop->Dispatch();
}
#if wxUSE_THREADS #if wxUSE_THREADS
else // no event loop or waiting in another thread // no event loop or waiting in another thread
if ( !eventLoop )
{ {
// We're busy waiting but at least give up the rest of our current // We're busy waiting but at least give up the rest of our current
// time slice. // time slice.