| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | //// detail/posix_thread.hpp// ~~~~~~~~~~~~~~~~~~~~~~~//// Copyright (c) 2003-2020 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)//#ifndef BOOST_ASIO_DETAIL_POSIX_THREAD_HPP#define BOOST_ASIO_DETAIL_POSIX_THREAD_HPP#if defined(_MSC_VER) && (_MSC_VER >= 1200)# pragma once#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)#include <boost/asio/detail/config.hpp>#if defined(BOOST_ASIO_HAS_PTHREADS)#include <cstddef>#include <pthread.h>#include <boost/asio/detail/noncopyable.hpp>#include <boost/asio/detail/push_options.hpp>namespace boost {namespace asio {namespace detail {extern "C"{  BOOST_ASIO_DECL void* boost_asio_detail_posix_thread_function(void* arg);}class posix_thread  : private noncopyable{public:  // Constructor.  template <typename Function>  posix_thread(Function f, unsigned int = 0)    : joined_(false)  {    start_thread(new func<Function>(f));  }  // Destructor.  BOOST_ASIO_DECL ~posix_thread();  // Wait for the thread to exit.  BOOST_ASIO_DECL void join();  // Get number of CPUs.  BOOST_ASIO_DECL static std::size_t hardware_concurrency();private:  friend void* boost_asio_detail_posix_thread_function(void* arg);  class func_base  {  public:    virtual ~func_base() {}    virtual void run() = 0;  };  struct auto_func_base_ptr  {    func_base* ptr;    ~auto_func_base_ptr() { delete ptr; }  };  template <typename Function>  class func    : public func_base  {  public:    func(Function f)      : f_(f)    {    }    virtual void run()    {      f_();    }  private:    Function f_;  };  BOOST_ASIO_DECL void start_thread(func_base* arg);  ::pthread_t thread_;  bool joined_;};} // namespace detail} // namespace asio} // namespace boost#include <boost/asio/detail/pop_options.hpp>#if defined(BOOST_ASIO_HEADER_ONLY)# include <boost/asio/detail/impl/posix_thread.ipp>#endif // defined(BOOST_ASIO_HEADER_ONLY)#endif // defined(BOOST_ASIO_HAS_PTHREADS)#endif // BOOST_ASIO_DETAIL_POSIX_THREAD_HPP
 |