*** a/boost/asio/datagram_socket_service.hpp 2013-09-22 15:13:33.000000000 -0700 --- b/boost/asio/datagram_socket_service.hpp 2014-05-06 04:20:40.438047289 -0700 *************** *** 22,27 **** --- 22,31 ---- #include #include + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + # include + #endif + #if defined(BOOST_ASIO_WINDOWS_RUNTIME) # include #elif defined(BOOST_ASIO_HAS_IOCP) *************** *** 135,140 **** --- 139,147 ---- /// Destroy a datagram socket implementation. void destroy(implementation_type& impl) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif service_impl_.destroy(impl); } *************** *** 167,172 **** --- 174,182 ---- boost::system::error_code close(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.close(impl, ec); } *************** *** 186,191 **** --- 196,204 ---- boost::system::error_code cancel(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.cancel(impl, ec); } *************** *** 225,230 **** --- 238,246 ---- const endpoint_type& peer_endpoint, BOOST_ASIO_MOVE_ARG(ConnectHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ConnectHandler, void (boost::system::error_code)> init( BOOST_ASIO_MOVE_CAST(ConnectHandler)(handler)); *************** *** 322,327 **** --- 338,346 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(WriteHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< WriteHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); *************** *** 349,354 **** --- 368,376 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(WriteHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< WriteHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); *************** *** 377,382 **** --- 399,407 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(ReadHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ReadHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); *************** *** 405,410 **** --- 430,438 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(ReadHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ReadHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); *************** *** 424,429 **** --- 452,462 ---- // The platform-specific implementation. service_impl_type service_impl_; + + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + // Per-socket lock used to make the socket service thread-safe + detail::mutex mutex_; + #endif }; } // namespace asio *** a/boost/asio/raw_socket_service.hpp 2013-09-22 15:13:33.000000000 -0700 --- b/boost/asio/raw_socket_service.hpp 2014-05-06 04:16:26.274052726 -0700 *************** *** 22,27 **** --- 22,31 ---- #include #include + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + # include + #endif + #if defined(BOOST_ASIO_WINDOWS_RUNTIME) # include #elif defined(BOOST_ASIO_HAS_IOCP) *************** *** 167,172 **** --- 171,179 ---- boost::system::error_code close(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.close(impl, ec); } *************** *** 186,191 **** --- 193,201 ---- boost::system::error_code cancel(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.cancel(impl, ec); } *************** *** 225,230 **** --- 235,243 ---- const endpoint_type& peer_endpoint, BOOST_ASIO_MOVE_ARG(ConnectHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ConnectHandler, void (boost::system::error_code)> init( BOOST_ASIO_MOVE_CAST(ConnectHandler)(handler)); *************** *** 302,307 **** --- 315,323 ---- boost::system::error_code shutdown(implementation_type& impl, socket_base::shutdown_type what, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.shutdown(impl, what, ec); } *************** *** 322,327 **** --- 338,346 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(WriteHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< WriteHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); *************** *** 349,354 **** --- 368,376 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(WriteHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< WriteHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); *************** *** 377,382 **** --- 399,407 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(ReadHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ReadHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); *************** *** 405,410 **** --- 430,438 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(ReadHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ReadHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); *************** *** 419,429 **** --- 447,465 ---- // Destroy all user-defined handler objects owned by the service. void shutdown_service() { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif service_impl_.shutdown_service(); } // The platform-specific implementation. service_impl_type service_impl_; + + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + // Per-socket lock used to make the socket service thread-safe + detail::mutex mutex_; + #endif }; } // namespace asio *** a/boost/asio/seq_packet_socket_service.hpp 2013-09-22 15:13:33.000000000 -0700 --- b/boost/asio/seq_packet_socket_service.hpp 2014-05-06 04:16:26.274052726 -0700 *************** *** 22,27 **** --- 22,31 ---- #include #include + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + # include + #endif + #if defined(BOOST_ASIO_WINDOWS_RUNTIME) # include #elif defined(BOOST_ASIO_HAS_IOCP) *************** *** 137,142 **** --- 141,149 ---- /// Destroy a sequenced packet socket implementation. void destroy(implementation_type& impl) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif service_impl_.destroy(impl); } *************** *** 169,174 **** --- 176,184 ---- boost::system::error_code close(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.close(impl, ec); } *************** *** 188,193 **** --- 198,206 ---- boost::system::error_code cancel(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.cancel(impl, ec); } *************** *** 227,232 **** --- 240,248 ---- const endpoint_type& peer_endpoint, BOOST_ASIO_MOVE_ARG(ConnectHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ConnectHandler, void (boost::system::error_code)> init( BOOST_ASIO_MOVE_CAST(ConnectHandler)(handler)); *************** *** 304,309 **** --- 320,328 ---- boost::system::error_code shutdown(implementation_type& impl, socket_base::shutdown_type what, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.shutdown(impl, what, ec); } *************** *** 325,330 **** --- 344,352 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(WriteHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< WriteHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); *************** *** 353,358 **** --- 375,383 ---- socket_base::message_flags& out_flags, BOOST_ASIO_MOVE_ARG(ReadHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ReadHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); *************** *** 367,377 **** --- 392,410 ---- // Destroy all user-defined handler objects owned by the service. void shutdown_service() { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif service_impl_.shutdown_service(); } // The platform-specific implementation. service_impl_type service_impl_; + + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + // Per-socket lock used to make the socket service thread-safe + detail::mutex mutex_; + #endif }; } // namespace asio *** a/boost/asio/stream_socket_service.hpp 2013-09-22 15:13:33.000000000 -0700 --- b/boost/asio/stream_socket_service.hpp 2014-05-06 04:16:26.274052726 -0700 *************** *** 22,27 **** --- 22,31 ---- #include #include + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + # include + #endif + #if defined(BOOST_ASIO_WINDOWS_RUNTIME) # include #elif defined(BOOST_ASIO_HAS_IOCP) *************** *** 135,140 **** --- 139,147 ---- /// Destroy a stream socket implementation. void destroy(implementation_type& impl) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif service_impl_.destroy(impl); } *************** *** 167,172 **** --- 174,182 ---- boost::system::error_code close(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.close(impl, ec); } *************** *** 186,191 **** --- 196,204 ---- boost::system::error_code cancel(implementation_type& impl, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.cancel(impl, ec); } *************** *** 225,230 **** --- 238,246 ---- const endpoint_type& peer_endpoint, BOOST_ASIO_MOVE_ARG(ConnectHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ConnectHandler, void (boost::system::error_code)> init( BOOST_ASIO_MOVE_CAST(ConnectHandler)(handler)); *************** *** 302,307 **** --- 318,326 ---- boost::system::error_code shutdown(implementation_type& impl, socket_base::shutdown_type what, boost::system::error_code& ec) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif return service_impl_.shutdown(impl, what, ec); } *************** *** 323,328 **** --- 342,350 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(WriteHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< WriteHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(WriteHandler)(handler)); *************** *** 350,355 **** --- 372,380 ---- socket_base::message_flags flags, BOOST_ASIO_MOVE_ARG(ReadHandler) handler) { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif detail::async_result_init< ReadHandler, void (boost::system::error_code, std::size_t)> init( BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)); *************** *** 363,373 **** --- 388,406 ---- // Destroy all user-defined handler objects owned by the service. void shutdown_service() { + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + detail::mutex::scoped_lock lock(mutex_); + #endif service_impl_.shutdown_service(); } // The platform-specific implementation. service_impl_type service_impl_; + + #if defined(BOOST_ASIO_THREAD_SAFE_SOCKET_SERVICES) + // Per-socket lock used to make the socket service thread-safe + detail::mutex mutex_; + #endif }; } // namespace asio