summaryrefslogtreecommitdiff
path: root/boost/asio/detail/winsock_init.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/asio/detail/winsock_init.hpp')
-rw-r--r--boost/asio/detail/winsock_init.hpp44
1 files changed, 41 insertions, 3 deletions
diff --git a/boost/asio/detail/winsock_init.hpp b/boost/asio/detail/winsock_init.hpp
index 702ba7119a..aef74f0b5a 100644
--- a/boost/asio/detail/winsock_init.hpp
+++ b/boost/asio/detail/winsock_init.hpp
@@ -2,7 +2,7 @@
// detail/winsock_init.hpp
// ~~~~~~~~~~~~~~~~~~~~~~~
//
-// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -17,7 +17,7 @@
#include <boost/asio/detail/config.hpp>
-#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
#include <boost/asio/detail/push_options.hpp>
@@ -39,8 +39,12 @@ protected:
BOOST_ASIO_DECL static void startup(data& d,
unsigned char major, unsigned char minor);
+ BOOST_ASIO_DECL static void manual_startup(data& d);
+
BOOST_ASIO_DECL static void cleanup(data& d);
+ BOOST_ASIO_DECL static void manual_cleanup(data& d);
+
BOOST_ASIO_DECL static void throw_on_error(data& d);
};
@@ -66,7 +70,41 @@ public:
cleanup(data_);
}
+ // This class may be used to indicate that user code will manage Winsock
+ // initialisation and cleanup. This may be required in the case of a DLL, for
+ // example, where it is not safe to initialise Winsock from global object
+ // constructors.
+ //
+ // To prevent asio from initialising Winsock, the object must be constructed
+ // before any Asio's own global objects. With MSVC, this may be accomplished
+ // by adding the following code to the DLL:
+ //
+ // #pragma warning(push)
+ // #pragma warning(disable:4073)
+ // #pragma init_seg(lib)
+ // boost::asio::detail::winsock_init<>::manual manual_winsock_init;
+ // #pragma warning(pop)
+ class manual
+ {
+ public:
+ manual()
+ {
+ manual_startup(data_);
+ }
+
+ manual(const manual&)
+ {
+ manual_startup(data_);
+ }
+
+ ~manual()
+ {
+ manual_cleanup(data_);
+ }
+ };
+
private:
+ friend class manual;
static data data_;
};
@@ -87,6 +125,6 @@ static const winsock_init<>& winsock_init_instance = winsock_init<>(false);
# include <boost/asio/detail/impl/winsock_init.ipp>
#endif // defined(BOOST_ASIO_HEADER_ONLY)
-#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+#endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
#endif // BOOST_ASIO_DETAIL_WINSOCK_INIT_HPP