1// 2// detail/impl/posix_thread.ipp 3// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4// 5// Copyright (c) 2003-2021 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 47std::size_t posix_thread::hardware_concurrency() 48{ 49#if defined(_SC_NPROCESSORS_ONLN) 50 long result = sysconf(_SC_NPROCESSORS_ONLN); 51 if (result > 0) 52 return result; 53#endif // defined(_SC_NPROCESSORS_ONLN) 54 return 0; 55} 56 57void posix_thread::start_thread(func_base* arg) 58{ 59 int error = ::pthread_create(&thread_, 0, 60 boost_asio_detail_posix_thread_function, arg); 61 if (error != 0) 62 { 63 delete arg; 64 boost::system::error_code ec(error, 65 boost::asio::error::get_system_category()); 66 boost::asio::detail::throw_error(ec, "thread"); 67 } 68} 69 70void* boost_asio_detail_posix_thread_function(void* arg) 71{ 72 posix_thread::auto_func_base_ptr func = { 73 static_cast<posix_thread::func_base*>(arg) }; 74 func.ptr->run(); 75 return 0; 76} 77 78} // namespace detail 79} // namespace asio 80} // namespace boost 81 82#include <boost/asio/detail/pop_options.hpp> 83 84#endif // defined(BOOST_ASIO_HAS_PTHREADS) 85 86#endif // BOOST_ASIO_DETAIL_IMPL_POSIX_THREAD_IPP 87