]> git.saurik.com Git - wxWidgets.git/commitdiff
only call GSocket_Init() when needed and do call it before using GAddress_XXX
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 24 Feb 2002 13:51:43 +0000 (13:51 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 24 Feb 2002 13:51:43 +0000 (13:51 +0000)
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
include/wx/socket.h
src/common/sckaddr.cpp
src/common/socket.cpp

index 087b9510d09bbccfd444521d4103325759760917..c9be201e8ec28a9c4a15e05376392516e0de5dab 100644 (file)
@@ -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 {
index aa1452743fd92d9add753b49db3e44390420d655..7b540329f8468f6334442bd45e6beb12b7b69f57 100644 (file)
@@ -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
index 4fd8ce90ed68eafbef0ce493172d39f036c9da92..1cfa463c864d003b59bb953329dde1ea8083500c 100644 (file)
 
 #if wxUSE_SOCKETS
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
+#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 <memory.h>
-#endif
+    #include <stdio.h>
+    #include <stdlib.h>
+    #include <ctype.h>
+
+    #if !defined(__MWERKS__) && !defined(__SALFORDC__)
+        #include <memory.h>
+    #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);
 }
 
index 9df24e42c9453decd31c6c67e986efef935c3a57..95669073cd46c8ea8a56b0f01b8e8048e4116bd2 100644 (file)
@@ -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)