From 4cc90442d0e65ab148e9f3398fcd7315360daa7a Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sun, 25 Jul 2004 12:41:14 +0000
Subject: [PATCH] documented how to use sockets in non-main thread (patch
 951134)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28464 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/socket.tex |  7 +++++++
 src/common/socket.cpp    | 20 ++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/docs/latex/wx/socket.tex b/docs/latex/wx/socket.tex
index 41936b4a60..1c8d64aa73 100644
--- a/docs/latex/wx/socket.tex
+++ b/docs/latex/wx/socket.tex
@@ -14,6 +14,13 @@
 wxSocketBase is the base class for all socket-related objects, and it
 defines all basic IO functionality.
 
+Note: (Workaround for implementation limitation for wxWidgets up to 2.5.x)
+If you want to use sockets or derived classes such as wxFTP in a secondary thread,
+call wxSocketBase::Initialize() (undocumented) from the main thread before creating 
+any sockets - in wxApp::OnInit for example. 
+See http://wiki.wxwidgets.org/wiki.pl?WxSocket or
+http://www.litwindow.com/knowhow/knowhow.html for more details.
+
 \wxheading{Derived from}
 
 \helpref{wxObject}{wxobject}
diff --git a/src/common/socket.cpp b/src/common/socket.cpp
index 5e8f4ff8de..bbbdc01e59 100644
--- a/src/common/socket.cpp
+++ b/src/common/socket.cpp
@@ -122,6 +122,26 @@ bool wxSocketBase::Initialize()
 {
     if ( !m_countInit++ )
     {
+#ifdef __WXMSW__
+        /*
+            The following asserting might be neccessary for linux as well,
+            but I cannot verify this.
+        */
+        wxASSERT(wxThread::IsMain(), 
+            wxT("To use sockets in a secondary thread, ")
+            wxT("call wxSocketBase::Initialize() from the main thread."));
+        /*
+            Details: Initialize() creates a hidden window as a sink for socket
+            events, such as 'read completed'. wxMSW has only one message loop
+            for the main thread. If Initialize is called in a secondary thread,
+            the socket window will be created for the secondary thread, but
+            since there is no message loop on this thread, it will never
+            receive events and all socket operations will time out.
+            BTW, the main thread must not be stopped using sleep or block
+            on a semaphore (a bad idea in any case) or socket operations 
+            will time out.
+        */
+#endif
         wxAppTraits *traits = wxAppConsole::GetInstance() ?
                               wxAppConsole::GetInstance()->GetTraits() : NULL;
         GSocketGUIFunctionsTable *functions = 
-- 
2.50.0

