1// 2// detail/impl/posix_thread.ipp 3// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4// 5// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6// 7// Distributed under the Boost Software License, Version 1.0. (See accompanying 8// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9// 10 11#ifndef BOOST_ASIO_DETAIL_IMPL_POSIX_THREAD_IPP 12#define BOOST_ASIO_DETAIL_IMPL_POSIX_THREAD_IPP 13 14#if defined(_MSC_VER) && (_MSC_VER >= 1200) 15# pragma once 16#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 17 18#include <boost/asio/detail/config.hpp> 19 20#if defined(BOOST_ASIO_HAS_PTHREADS) 21 22#include <boost/asio/detail/posix_thread.hpp> 23#include <boost/asio/detail/throw_error.hpp> 24#include <boost/asio/error.hpp> 25 26#include <boost/asio/detail/push_options.hpp> 27 28namespace boost { 29namespace asio { 30namespace detail { 31 32posix_thread::~posix_thread() 33{ 34 if (!joined_) 35 ::pthread_detach(thread_); 36} 37 38void posix_thread::join() 39{ 40 if (!joined_) 41 { 42 ::pthread_join(thread_, 0); 43 joined_ = true; 44 } 45} 46 47void posix_thread::start_thread(func_base* arg) 48{ 49 int error = ::pthread_create(&thread_, 0, 50 boost_asio_detail_posix_thread_function, arg); 51 if (error != 0) 52 { 53 delete arg; 54 boost::system::error_code ec(error, 55 boost::asio::error::get_system_category()); 56 boost::asio::detail::throw_error(ec, "thread"); 57 } 58} 59 60void* boost_asio_detail_posix_thread_function(void* arg) 61{ 62 posix_thread::auto_func_base_ptr func = { 63 static_cast<posix_thread::func_base*>(arg) }; 64 func.ptr->run(); 65 return 0; 66} 67 68} // namespace detail 69} // namespace asio 70} // namespace boost 71 72#include <boost/asio/detail/pop_options.hpp> 73 74#endif // defined(BOOST_ASIO_HAS_PTHREADS) 75 76#endif // BOOST_ASIO_DETAIL_IMPL_POSIX_THREAD_IPP 77