// 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
{
bool more = TRUE;
- while (more)
+ while (more)
{
if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() )
break;
// ==========================================================================
-// wxSocketServer
+// wxSocketServer
// ==========================================================================
// --------------------------------------------------------------------------
sock->SetFlags(m_flags);
if (!AcceptWith(*sock, wait))
- return NULL;
+ {
+ sock->Destroy();
+ sock = NULL;
+ }
return sock;
}
DECLARE_DYNAMIC_CLASS(wxSocketModule)
public:
- bool OnInit() { return GSocket_Init(); }
+ bool OnInit() { return GSocket_Init() != 0; }
void OnExit() { GSocket_Cleanup(); }
};