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:
@@ -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.
|
||||||
|
Reference in New Issue
Block a user