From ebbf7407644c407815de10284a49042f602101c1 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 2 Jan 2009 22:07:45 +0000 Subject: [PATCH] streamline handling of wxSOCKET_LOST in DoWait() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57798 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/socket.h | 16 ++++++------ src/common/socket.cpp | 57 +++++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 43 deletions(-) diff --git a/include/wx/socket.h b/include/wx/socket.h index 6895d8987c..efc5652531 100644 --- a/include/wx/socket.h +++ b/include/wx/socket.h @@ -204,21 +204,19 @@ private: // wait until the given flags are set for this socket or the given timeout // (or m_timeout) expires // - // notice that wxSOCKET_LOST_FLAG is always taken into account but the - // return value depends on whether it is included in flags or not: if it - // is, and the connection is indeed lost, true is returned, but if it isn't - // then the function returns false in this case - // - // false is always returned if we returned because of the timeout expiration - bool DoWait(long timeout, wxSocketEventFlags flags); + // notice that wxSOCKET_LOST_FLAG is always taken into account and the + // function returns -1 if the connection was lost; otherwise it returns + // true if any of the events specified by flags argument happened or false + // if the timeout expired + int DoWait(long timeout, wxSocketEventFlags flags); // a helper calling DoWait() using the same convention as the public // WaitForXXX() functions use, i.e. use our timeout if seconds == -1 or the // specified timeout otherwise - bool DoWait(long seconds, long milliseconds, wxSocketEventFlags flags); + int DoWait(long seconds, long milliseconds, wxSocketEventFlags flags); // another helper calling DoWait() using our m_timeout - bool DoWaitWithTimeout(wxSocketEventFlags flags) + int DoWaitWithTimeout(wxSocketEventFlags flags) { return DoWait(m_timeout*1000, flags); } diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 7cf968782f..88937119b1 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -912,8 +912,7 @@ wxUint32 wxSocketBase::DoRead(void* buffer_, wxUint32 nbytes) // otherwise wait until the socket becomes ready for reading or // an error occurs on it - if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG | - wxSOCKET_LOST_FLAG) ) + if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG) ) { // and exit if the timeout elapsed before it did SetError(wxSOCKET_TIMEDOUT); @@ -1082,8 +1081,7 @@ wxUint32 wxSocketBase::DoWrite(const void *buffer_, wxUint32 nbytes) if ( m_flags & wxSOCKET_NOWAIT ) break; - if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG | - wxSOCKET_LOST_FLAG) ) + if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG) ) { SetError(wxSOCKET_TIMEDOUT); break; @@ -1281,7 +1279,7 @@ wxSocketEventFlags wxSocketImpl::Select(wxSocketEventFlags flags, return detected & flags; } -bool +int wxSocketBase::DoWait(long seconds, long milliseconds, wxSocketEventFlags flags) { // Use either the provided timeout or the default timeout value associated @@ -1294,14 +1292,14 @@ wxSocketBase::DoWait(long seconds, long milliseconds, wxSocketEventFlags flags) return DoWait(timeout, flags); } -bool +int wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags) { - wxCHECK_MSG( m_impl, false, "can't wait on invalid socket" ); + wxCHECK_MSG( m_impl, -1, "can't wait on invalid socket" ); // we're never going to become ready if we're not connected (any more) if ( !m_connected && !m_establishing ) - return (flags & wxSOCKET_LOST_FLAG) != 0; + return -1; // This can be set to true from Interrupt() to exit this function a.s.a.p. m_interrupt = false; @@ -1326,8 +1324,8 @@ wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags) // 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 // is 0 as this is used for polling) - bool gotEvent = false; - for ( bool firstTime = true; !m_interrupt ; firstTime = false ) + int rc = 0; + for ( bool firstTime = true; !m_interrupt; firstTime = false ) { long timeLeft = wxMilliClockToLong(timeEnd - wxGetLocalTimeMillis()); if ( timeLeft < 0 ) @@ -1363,8 +1361,7 @@ wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags) { m_connected = false; m_establishing = false; - if ( flags & wxSOCKET_LOST_FLAG ) - gotEvent = true; + rc = -1; break; } @@ -1376,29 +1373,27 @@ wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags) { m_connected = true; m_establishing = false; - gotEvent = true; + rc = true; break; } // Data available or output buffer ready? if ( (events & wxSOCKET_INPUT_FLAG) || (events & wxSOCKET_OUTPUT_FLAG) ) { - gotEvent = true; + rc = true; break; } } - return gotEvent; + return rc; } bool wxSocketBase::Wait(long seconds, long milliseconds) { return DoWait(seconds, milliseconds, - wxSOCKET_INPUT_FLAG | - wxSOCKET_OUTPUT_FLAG | - wxSOCKET_CONNECTION_FLAG | - wxSOCKET_LOST_FLAG - ); + wxSOCKET_INPUT_FLAG | + wxSOCKET_OUTPUT_FLAG | + wxSOCKET_CONNECTION_FLAG) != 0; } bool wxSocketBase::WaitForRead(long seconds, long milliseconds) @@ -1414,11 +1409,7 @@ bool wxSocketBase::WaitForRead(long seconds, long milliseconds) if ( m_impl->Select(wxSOCKET_INPUT_FLAG) ) return true; - // Note that wxSOCKET_LOST_FLAG has to be explicitly passed to DoWait - // because of the semantics of WaitForRead: a return value of true means - // that a Read call will return immediately, not that there is - // actually data to read. - return DoWait(seconds, milliseconds, wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + return DoWait(seconds, milliseconds, wxSOCKET_INPUT_FLAG) != 0; } @@ -1427,12 +1418,12 @@ bool wxSocketBase::WaitForWrite(long seconds, long milliseconds) if ( m_impl->Select(wxSOCKET_OUTPUT_FLAG) ) return true; - return DoWait(seconds, milliseconds, wxSOCKET_OUTPUT_FLAG | wxSOCKET_LOST_FLAG); + return DoWait(seconds, milliseconds, wxSOCKET_OUTPUT_FLAG) != 0; } bool wxSocketBase::WaitForLost(long seconds, long milliseconds) { - return DoWait(seconds, milliseconds, wxSOCKET_LOST_FLAG); + return DoWait(seconds, milliseconds, wxSOCKET_LOST_FLAG) == -1; } // -------------------------------------------------------------------------- @@ -1756,7 +1747,7 @@ wxSocketBase *wxSocketServer::Accept(bool wait) bool wxSocketServer::WaitForAccept(long seconds, long milliseconds) { - return DoWait(seconds, milliseconds, wxSOCKET_CONNECTION_FLAG); + return DoWait(seconds, milliseconds, wxSOCKET_CONNECTION_FLAG) == 1; } bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) @@ -1890,12 +1881,10 @@ bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds) wxCHECK_MSG( m_establishing && m_impl, false, "No connection establishment attempt in progress" ); - // we must specify wxSOCKET_LOST_FLAG here explicitly because we must return - // true if the connection establishment process is finished, whether it is - // over because we successfully connected or because we were not able to - // connect - return DoWait(seconds, milliseconds, - wxSOCKET_CONNECTION_FLAG | wxSOCKET_LOST_FLAG); + // notice that we return true even if DoWait() returned -1, i.e. if an + // error occurred and connection was lost: this is intentional as we should + // return false only if timeout expired without anything happening + return DoWait(seconds, milliseconds, wxSOCKET_CONNECTION_FLAG) != 0; } // ========================================================================== -- 2.45.2