From 87ebc943d48c6aee17b8074c2817c6ea25a123e4 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 16 Nov 2013 23:40:53 +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/branches/WX_3_0_BRANCH@75211 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 4 ++++ src/common/socket.cpp | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/changes.txt b/docs/changes.txt index e71268c6a4..4cdf1bf0eb 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -574,6 +574,10 @@ Major new features in this release 3.0.1: (released 2014-xx-xx) ---------------------------- +All: + +- Fix wxSocket::WaitForAccept() in non-main thread (Hajo Kirchhoff). + All (GUI): - Fix crash when setting invalid label ending with "&" (ZaneUJi). 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) ) {