Home | History | Annotate | Download | only in detail
      1 //
      2 // detail/posix_thread.hpp
      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 ASIO_DETAIL_POSIX_THREAD_HPP
     12 #define ASIO_DETAIL_POSIX_THREAD_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 
     17 #if defined(ASIO_HAS_PTHREADS)
     18 
     19 #include <pthread.h>
     20 #include "asio/detail/noncopyable.hpp"
     21 
     22 #include "asio/detail/push_options.hpp"
     23 
     24 namespace asio {
     25 namespace detail {
     26 
     27 extern "C"
     28 {
     29   ASIO_DECL void* asio_detail_posix_thread_function(void* arg);
     30 }
     31 
     32 class posix_thread
     33   : private noncopyable
     34 {
     35 public:
     36   // Constructor.
     37   template <typename Function>
     38   posix_thread(Function f, unsigned int = 0)
     39     : joined_(false)
     40   {
     41     start_thread(new func<Function>(f));
     42   }
     43 
     44   // Destructor.
     45   ASIO_DECL ~posix_thread();
     46 
     47   // Wait for the thread to exit.
     48   ASIO_DECL void join();
     49 
     50 private:
     51   friend void* asio_detail_posix_thread_function(void* arg);
     52 
     53   class func_base
     54   {
     55   public:
     56     virtual ~func_base() {}
     57     virtual void run() = 0;
     58   };
     59 
     60   struct auto_func_base_ptr
     61   {
     62     func_base* ptr;
     63     ~auto_func_base_ptr() { delete ptr; }
     64   };
     65 
     66   template <typename Function>
     67   class func
     68     : public func_base
     69   {
     70   public:
     71     func(Function f)
     72       : f_(f)
     73     {
     74     }
     75 
     76     virtual void run()
     77     {
     78       f_();
     79     }
     80 
     81   private:
     82     Function f_;
     83   };
     84 
     85   ASIO_DECL void start_thread(func_base* arg);
     86 
     87   ::pthread_t thread_;
     88   bool joined_;
     89 };
     90 
     91 } // namespace detail
     92 } // namespace asio
     93 
     94 #include "asio/detail/pop_options.hpp"
     95 
     96 # include "asio/detail/impl/posix_thread.ipp"
     97 
     98 #endif // defined(ASIO_HAS_PTHREADS)
     99 
    100 #endif // ASIO_DETAIL_POSIX_THREAD_HPP
    101