X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1d4dd7add411ebff1ce4a8d1d992e0e43ee26b1..f0b7eadf889c2882e81470ec8e629d831858acb1:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index d79c4986c2..60bbc1f48d 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -6,7 +6,7 @@ // Copyright: (C) 1999-1997, Guilhem Lavaux // (C) 2000-1999, Guillermo Rodriguez Garcia // RCS_ID: $Id$ -// License: see wxWindows license +// License: see wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ========================================================================== @@ -27,6 +27,7 @@ #if wxUSE_SOCKETS #include "wx/app.h" +#include "wx/apptrait.h" #include "wx/defs.h" #include "wx/object.h" #include "wx/string.h" @@ -37,13 +38,13 @@ #include "wx/intl.h" #include "wx/event.h" -#if wxUSE_GUI - #include "wx/gdicmn.h" // for wxPendingDelete -#endif // wxUSE_GUI - #include "wx/sckaddr.h" #include "wx/socket.h" +// DLL options compatibility check: +#include "wx/build.h" +WX_CHECK_BUILD_OPTIONS("wxNet") + // -------------------------------------------------------------------------- // macros and constants // -------------------------------------------------------------------------- @@ -51,30 +52,24 @@ // discard buffer #define MAX_DISCARD_SIZE (10 * 1024) -// 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 - #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 +// what to do within waits: 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_THREADS + #define PROCESS_EVENTS() \ + { \ + if ( wxThread::IsMain() ) \ + wxYield(); \ + else \ + wxThread::Yield(); \ + } +#else // !wxUSE_THREADS + #define PROCESS_EVENTS() wxYield() +#endif // wxUSE_THREADS/!wxUSE_THREADS #define wxTRACE_Socket _T("wxSocket") @@ -213,9 +208,9 @@ wxSocketBase::~wxSocketBase() { // Just in case the app called Destroy() *and* then deleted // the socket immediately: don't leave dangling pointers. -#if wxUSE_GUI - wxPendingDelete.DeleteObject(this); -#endif + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + traits->RemoveFromPendingDelete(this); // Shutdown and close the socket if (!m_beingDeleted) @@ -243,12 +238,18 @@ bool wxSocketBase::Destroy() // Supress events from now on Notify(FALSE); -#if wxUSE_GUI - if ( !wxPendingDelete.Member(this) ) - wxPendingDelete.Append(this); -#else - delete this; -#endif + // schedule this object for deletion + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + { + // let the traits object decide what to do with us + traits->ScheduleForDestroy(this); + } + else // no app or no traits + { + // in wxBase we might have no app object at all, don't leak memory + delete this; + } return TRUE; } @@ -831,7 +832,7 @@ void wxSocketBase::SaveState() void wxSocketBase::RestoreState() { - wxNode *node; + wxList::compatibility_iterator node; wxSocketState *state; node = m_states.GetLast(); @@ -849,7 +850,7 @@ void wxSocketBase::RestoreState() m_cdata = state->m_cdata; #endif // WXWIN_COMPATIBILITY - delete node; + m_states.Erase(node); delete state; } @@ -1301,7 +1302,7 @@ wxDatagramSocket& wxDatagramSocket::SendTo( wxSockAddress& addr, // wxSocketModule // ========================================================================== -class WXDLLEXPORT wxSocketModule : public wxModule +class wxSocketModule : public wxModule { public: virtual bool OnInit()