• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>
posix_thread(Function f,unsigned int=0)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:
~func_base()56     virtual ~func_base() {}
57     virtual void run() = 0;
58   };
59 
60   struct auto_func_base_ptr
61   {
62     func_base* ptr;
~auto_func_base_ptrasio::detail::posix_thread::auto_func_base_ptr63     ~auto_func_base_ptr() { delete ptr; }
64   };
65 
66   template <typename Function>
67   class func
68     : public func_base
69   {
70   public:
func(Function f)71     func(Function f)
72       : f_(f)
73     {
74     }
75 
run()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