X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5f3629babd86a81f255fc3f22a824841c54e93e8..243d4b360385d3364e96d5600f693139e359fb3b:/src/common/socket.cpp?ds=inline diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 5036742c4d..7ec0743ec1 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -51,12 +51,30 @@ // discard buffer #define MAX_DISCARD_SIZE (10 * 1024) -// what to do within waits +// what to do within waits: in wxBase we don't do anything as we don't have +// the event loop anyhow (for now). In GUI apps we have 2 cases: from the main +// thread itself we have to call wxYield() to let the events (including the +// GUI events and the low-level (not wxWindows) events from GSocket) be +// processed. From another thread it is enough to just call wxThread::Yield() +// which will give away the rest of our time slice: the explanation is that +// the events will be processed by the main thread anyhow, without calling +// wxYield(), but we don't want to eat the CPU time uselessly while sitting +// in the loop waiting for the data #if wxUSE_GUI - #define PROCESS_EVENTS() wxYield() -#else - #define PROCESS_EVENTS() -#endif + #if wxUSE_THREADS + #define PROCESS_EVENTS() \ + { \ + if ( wxThread::IsMain() ) \ + wxYield(); \ + else \ + wxThread::Yield(); \ + } + #else // !wxUSE_THREADS + #define PROCESS_EVENTS() wxYield() + #endif // wxUSE_THREADS/!wxUSE_THREADS +#else // !wxUSE_GUI + #define PROCESS_EVENTS() +#endif // wxUSE_GUI/!wxUSE_GUI // -------------------------------------------------------------------------- // wxWin macros @@ -255,26 +273,27 @@ wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes) // Possible combinations (they are checked in this order) // wxSOCKET_NOWAIT - // wxSOCKET_WAITALL | wxSOCKET_BLOCK - // wxSOCKET_WAITALL + // wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK) // wxSOCKET_BLOCK // wxSOCKET_NONE // if (m_flags & wxSOCKET_NOWAIT) { - GSocket_SetNonBlocking(m_socket, TRUE); + GSocket_SetNonBlocking(m_socket, 1); ret = GSocket_Read(m_socket, (char *)buffer, nbytes); - GSocket_SetNonBlocking(m_socket, FALSE); + GSocket_SetNonBlocking(m_socket, 0); if (ret > 0) total += ret; } - else if (m_flags & wxSOCKET_WAITALL) + else { - while (ret > 0 && nbytes > 0) + bool more = TRUE; + + while (more) { - if (!(m_flags & wxSOCKET_BLOCK) && !WaitForRead()) - break; + if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForRead() ) + break; ret = GSocket_Read(m_socket, (char *)buffer, nbytes); @@ -284,16 +303,12 @@ wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes) nbytes -= ret; buffer = (char *)buffer + ret; } - } - } - else - { - if ((m_flags & wxSOCKET_BLOCK) || WaitForRead()) - { - ret = GSocket_Read(m_socket, (char *)buffer, nbytes); - if (ret > 0) - total += ret; + // If we got here and wxSOCKET_WAITALL is not set, we can leave + // now. Otherwise, wait until we recv all the data or until there + // is an error. + // + more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL)); } } @@ -329,7 +344,7 @@ wxSocketBase& wxSocketBase::ReadMsg(void* buffer, wxUint32 nbytes) if (sig != 0xfeeddead) { - wxLogWarning( _("wxSocket: invalid signature in ReadMsg.")); + wxLogWarning(_("wxSocket: invalid signature in ReadMsg.")); goto exit; } @@ -383,7 +398,7 @@ wxSocketBase& wxSocketBase::ReadMsg(void* buffer, wxUint32 nbytes) if (sig != 0xdeadfeed) { - wxLogWarning( _("wxSocket: invalid signature in ReadMsg.")); + wxLogWarning(_("wxSocket: invalid signature in ReadMsg.")); goto exit; } @@ -443,51 +458,48 @@ wxUint32 wxSocketBase::_Write(const void *buffer, wxUint32 nbytes) wxUint32 total = 0; int ret = 1; - // If the socket is invalid, return immediately - if (!m_socket) + // If the socket is invalid or parameters are ill, return immediately + if (!m_socket || !buffer || !nbytes) return 0; // Possible combinations (they are checked in this order) // wxSOCKET_NOWAIT - // wxSOCKET_WAITALL | wxSOCKET_BLOCK - // wxSOCKET_WAITALL + // wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK) // wxSOCKET_BLOCK // wxSOCKET_NONE // if (m_flags & wxSOCKET_NOWAIT) { - GSocket_SetNonBlocking(m_socket, TRUE); + GSocket_SetNonBlocking(m_socket, 1); ret = GSocket_Write(m_socket, (const char *)buffer, nbytes); - GSocket_SetNonBlocking(m_socket, FALSE); + GSocket_SetNonBlocking(m_socket, 0); if (ret > 0) total = ret; } - else if (m_flags & wxSOCKET_WAITALL) + else { - while (ret > 0 && nbytes > 0) + bool more = TRUE; + + while (more) { - if (!(m_flags & wxSOCKET_BLOCK) && !WaitForWrite()) - break; + if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() ) + break; ret = GSocket_Write(m_socket, (const char *)buffer, nbytes); - + if (ret > 0) { total += ret; nbytes -= ret; buffer = (const char *)buffer + ret; } - } - } - else - { - if ((m_flags & wxSOCKET_BLOCK) || WaitForWrite()) - { - ret = GSocket_Write(m_socket, (const char *)buffer, nbytes); - if (ret > 0) - total = ret; + // If we got here and wxSOCKET_WAITALL is not set, we can leave + // now. Otherwise, wait until we send all the data or until there + // is an error. + // + more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL)); } } @@ -906,7 +918,7 @@ void wxSocketBase::OnRequest(wxSocketNotify notification) case GSOCK_CONNECTION: flag = GSOCK_CONNECTION_FLAG; break; case GSOCK_LOST: flag = GSOCK_LOST_FLAG; break; default: - wxLogWarning( _("wxSocket: unknown event!.")); + wxLogWarning(_("wxSocket: unknown event!.")); return; } @@ -998,7 +1010,7 @@ wxUint32 wxSocketBase::GetPushback(void *buffer, wxUint32 size, bool peek) // ========================================================================== -// wxSocketServer +// wxSocketServer // ========================================================================== // -------------------------------------------------------------------------- @@ -1047,12 +1059,12 @@ bool wxSocketServer::AcceptWith(wxSocketBase& sock, bool wait) // again. if (!wait) - GSocket_SetNonBlocking(m_socket, TRUE); + GSocket_SetNonBlocking(m_socket, 1); child_socket = GSocket_WaitConnection(m_socket); if (!wait) - GSocket_SetNonBlocking(m_socket, FALSE); + GSocket_SetNonBlocking(m_socket, 0); if (!child_socket) return FALSE; @@ -1076,7 +1088,10 @@ wxSocketBase *wxSocketServer::Accept(bool wait) sock->SetFlags(m_flags); if (!AcceptWith(*sock, wait)) - return NULL; + { + sock->Destroy(); + sock = NULL; + } return sock; } @@ -1135,13 +1150,13 @@ bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait) // again. if (!wait) - GSocket_SetNonBlocking(m_socket, TRUE); + GSocket_SetNonBlocking(m_socket, 1); GSocket_SetPeer(m_socket, addr_man.GetAddress()); err = GSocket_Connect(m_socket, GSOCK_STREAMED); if (!wait) - GSocket_SetNonBlocking(m_socket, FALSE); + GSocket_SetNonBlocking(m_socket, 0); if (err != GSOCK_NOERROR) { @@ -1248,7 +1263,7 @@ class WXDLLEXPORT wxSocketModule : public wxModule DECLARE_DYNAMIC_CLASS(wxSocketModule) public: - bool OnInit() { return GSocket_Init(); } + bool OnInit() { return GSocket_Init() != 0; } void OnExit() { GSocket_Cleanup(); } };