From b6c6bceb94aff7730e0ff90b242c0a861aa8a9a2 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 16 Nov 2013 23:37:28 +0000 Subject: [PATCH] Fix wxSocket::WaitForAccept() in worker thread. This was broken because Select() never returned wxSOCKET_CONNECTION_FLAG which is supposed to be set when a connection is accepted. Closes #15669. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75205 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/socket.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/common/socket.cpp b/src/common/socket.cpp index a793e3520d..bcb331fcc3 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -1357,7 +1357,25 @@ wxSocketEventFlags wxSocketImpl::Select(wxSocketEventFlags flags, wxSocketEventFlags detected = 0; if ( preadfds && wxFD_ISSET(m_fd, preadfds) ) - detected |= wxSOCKET_INPUT_FLAG; + { + // check for the case of a server socket waiting for connection + if ( m_server && (flags & wxSOCKET_CONNECTION_FLAG) ) + { + int error; + SOCKOPTLEN_T len = sizeof(error); + m_establishing = false; + getsockopt(m_fd, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + + if ( error ) + detected = wxSOCKET_LOST_FLAG; + else + detected |= wxSOCKET_CONNECTION_FLAG; + } + else // not called to get non-blocking accept() status + { + detected |= wxSOCKET_INPUT_FLAG; + } + } if ( pwritefds && wxFD_ISSET(m_fd, pwritefds) ) {