From 6c0d0845c205a59cb0d8c73c0e4bcc84a9d6c550 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 24 Feb 2002 13:51:43 +0000 Subject: [PATCH] only call GSocket_Init() when needed and do call it before using GAddress_XXX functions (fixes bug 510722) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14387 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/sckaddr.h | 5 +++- include/wx/socket.h | 8 ++++++ src/common/sckaddr.cpp | 39 ++++++++++++++++++-------- src/common/socket.cpp | 63 +++++++++++++++++++++++++++++++++++++++--- 4 files changed, 99 insertions(+), 16 deletions(-) diff --git a/include/wx/sckaddr.h b/include/wx/sckaddr.h index 087b9510d0..c9be201e8e 100644 --- a/include/wx/sckaddr.h +++ b/include/wx/sckaddr.h @@ -42,11 +42,14 @@ public: void SetAddress(GAddress *address); // we need to be able to create copies of the addresses polymorphically (i.e. - // wihtout knowing the exact address class) + // without knowing the exact address class) virtual wxSockAddress *Clone() const = 0; protected: GAddress *m_address; + +private: + void Init(); }; class WXDLLEXPORT wxIPV4address : public wxSockAddress { diff --git a/include/wx/socket.h b/include/wx/socket.h index aa1452743f..7b540329f8 100644 --- a/include/wx/socket.h +++ b/include/wx/socket.h @@ -185,6 +185,11 @@ public: void SetNotify(wxSocketEventFlags flags); void Notify(bool notify); + // initialize/shutdown the sockets (usually called automatically) + static bool IsInitialized(); + static bool Initialize(); + static void Shutdown(); + // callbacks are deprecated, use events instead #if WXWIN_COMPATIBILITY wxSockCbk Callback(wxSockCbk cbk_); @@ -247,6 +252,9 @@ private: bool m_notify; // notify events to users? wxSocketEventFlags m_eventmask; // which events to notify? + // the initialization count, GSocket is initialized if > 0 + static size_t m_countInit; + // callbacks are deprecated, use events instead #if WXWIN_COMPATIBILITY wxSockCbk m_cbk; // callback diff --git a/src/common/sckaddr.cpp b/src/common/sckaddr.cpp index 4fd8ce90ed..1cfa463c86 100644 --- a/src/common/sckaddr.cpp +++ b/src/common/sckaddr.cpp @@ -22,19 +22,23 @@ #if wxUSE_SOCKETS -#include -#include -#include +#ifndef WX_PRECOMP + #include "wx/defs.h" + #include "wx/object.h" + #include "wx/log.h" + #include "wx/intl.h" -#if !defined(__MWERKS__) && !defined(__SALFORDC__) -#include -#endif + #include + #include + #include + + #if !defined(__MWERKS__) && !defined(__SALFORDC__) + #include + #endif +#endif // !WX_PRECOMP -#include "wx/defs.h" -#include "wx/object.h" -#include "wx/log.h" -#include "wx/intl.h" #include "wx/gsocket.h" +#include "wx/socket.h" #include "wx/sckaddr.h" IMPLEMENT_ABSTRACT_CLASS(wxSockAddress, wxObject) @@ -50,13 +54,26 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress) // wxIPV4address // --------------------------------------------------------------------------- +void wxSockAddress::Init() +{ + if ( !wxSocketBase::IsInitialized() ) + { + // we must do it before using GAddress_XXX functions + (void)wxSocketBase::Initialize(); + } +} + wxSockAddress::wxSockAddress() { - m_address = GAddress_new(); + Init(); + + m_address = GAddress_new(); } wxSockAddress::wxSockAddress(const wxSockAddress& other) { + Init(); + m_address = GAddress_copy(other.m_address); } diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 9df24e42c9..95669073cd 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -110,6 +110,44 @@ public: // wxSocketBase // ========================================================================== +// -------------------------------------------------------------------------- +// Initialization and shutdown +// -------------------------------------------------------------------------- + +// FIXME-MT: all this is MT-unsafe, of course, we should protect all accesses +// to m_countInit with a crit section +size_t wxSocketBase::m_countInit = 0; + +bool wxSocketBase::IsInitialized() +{ + return m_countInit > 0; +} + +bool wxSocketBase::Initialize() +{ + if ( !m_countInit++ ) + { + if ( !GSocket_Init() ) + { + m_countInit--; + + return FALSE; + } + } + + return TRUE; +} + +void wxSocketBase::Shutdown() +{ + // we should be initialized + wxASSERT_MSG( m_countInit, _T("extra call to Shutdown()") ); + if ( !--m_countInit ) + { + GSocket_Cleanup(); + } +} + // -------------------------------------------------------------------------- // Ctor and dtor // -------------------------------------------------------------------------- @@ -145,6 +183,13 @@ void wxSocketBase::Init() m_cbk = NULL; m_cdata = NULL; #endif // WXWIN_COMPATIBILITY + + if ( !IsInitialized() ) + { + // this Initialize() will be undone by wxSocketModule::OnExit(), all the + // other calls to it should be matched by a call to Shutdown() + Initialize(); + } } wxSocketBase::wxSocketBase() @@ -1242,11 +1287,21 @@ wxDatagramSocket& wxDatagramSocket::SendTo( wxSockAddress& addr, class WXDLLEXPORT wxSocketModule : public wxModule { - DECLARE_DYNAMIC_CLASS(wxSocketModule) - public: - bool OnInit() { return GSocket_Init() != 0; } - void OnExit() { GSocket_Cleanup(); } + virtual bool OnInit() + { + // wxSocketBase will call GSocket_Init() itself when/if needed + return TRUE; + } + + virtual void OnExit() + { + if ( wxSocketBase::IsInitialized() ) + wxSocketBase::Shutdown(); + } + +private: + DECLARE_DYNAMIC_CLASS(wxSocketModule) }; IMPLEMENT_DYNAMIC_CLASS(wxSocketModule, wxModule)