Chris@16
|
1 //
|
Chris@16
|
2 // detail/posix_thread.hpp
|
Chris@16
|
3 // ~~~~~~~~~~~~~~~~~~~~~~~
|
Chris@16
|
4 //
|
Chris@101
|
5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
Chris@16
|
6 //
|
Chris@16
|
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
9 //
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_ASIO_DETAIL_POSIX_THREAD_HPP
|
Chris@16
|
12 #define BOOST_ASIO_DETAIL_POSIX_THREAD_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
Chris@16
|
15 # pragma once
|
Chris@16
|
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/asio/detail/config.hpp>
|
Chris@16
|
19
|
Chris@16
|
20 #if defined(BOOST_ASIO_HAS_PTHREADS)
|
Chris@16
|
21
|
Chris@16
|
22 #include <pthread.h>
|
Chris@16
|
23 #include <boost/asio/detail/noncopyable.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 #include <boost/asio/detail/push_options.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 namespace boost {
|
Chris@16
|
28 namespace asio {
|
Chris@16
|
29 namespace detail {
|
Chris@16
|
30
|
Chris@16
|
31 extern "C"
|
Chris@16
|
32 {
|
Chris@16
|
33 BOOST_ASIO_DECL void* boost_asio_detail_posix_thread_function(void* arg);
|
Chris@16
|
34 }
|
Chris@16
|
35
|
Chris@16
|
36 class posix_thread
|
Chris@16
|
37 : private noncopyable
|
Chris@16
|
38 {
|
Chris@16
|
39 public:
|
Chris@16
|
40 // Constructor.
|
Chris@16
|
41 template <typename Function>
|
Chris@16
|
42 posix_thread(Function f, unsigned int = 0)
|
Chris@16
|
43 : joined_(false)
|
Chris@16
|
44 {
|
Chris@16
|
45 start_thread(new func<Function>(f));
|
Chris@16
|
46 }
|
Chris@16
|
47
|
Chris@16
|
48 // Destructor.
|
Chris@16
|
49 BOOST_ASIO_DECL ~posix_thread();
|
Chris@16
|
50
|
Chris@16
|
51 // Wait for the thread to exit.
|
Chris@16
|
52 BOOST_ASIO_DECL void join();
|
Chris@16
|
53
|
Chris@16
|
54 private:
|
Chris@16
|
55 friend void* boost_asio_detail_posix_thread_function(void* arg);
|
Chris@16
|
56
|
Chris@16
|
57 class func_base
|
Chris@16
|
58 {
|
Chris@16
|
59 public:
|
Chris@16
|
60 virtual ~func_base() {}
|
Chris@16
|
61 virtual void run() = 0;
|
Chris@16
|
62 };
|
Chris@16
|
63
|
Chris@16
|
64 struct auto_func_base_ptr
|
Chris@16
|
65 {
|
Chris@16
|
66 func_base* ptr;
|
Chris@16
|
67 ~auto_func_base_ptr() { delete ptr; }
|
Chris@16
|
68 };
|
Chris@16
|
69
|
Chris@16
|
70 template <typename Function>
|
Chris@16
|
71 class func
|
Chris@16
|
72 : public func_base
|
Chris@16
|
73 {
|
Chris@16
|
74 public:
|
Chris@16
|
75 func(Function f)
|
Chris@16
|
76 : f_(f)
|
Chris@16
|
77 {
|
Chris@16
|
78 }
|
Chris@16
|
79
|
Chris@16
|
80 virtual void run()
|
Chris@16
|
81 {
|
Chris@16
|
82 f_();
|
Chris@16
|
83 }
|
Chris@16
|
84
|
Chris@16
|
85 private:
|
Chris@16
|
86 Function f_;
|
Chris@16
|
87 };
|
Chris@16
|
88
|
Chris@16
|
89 BOOST_ASIO_DECL void start_thread(func_base* arg);
|
Chris@16
|
90
|
Chris@16
|
91 ::pthread_t thread_;
|
Chris@16
|
92 bool joined_;
|
Chris@16
|
93 };
|
Chris@16
|
94
|
Chris@16
|
95 } // namespace detail
|
Chris@16
|
96 } // namespace asio
|
Chris@16
|
97 } // namespace boost
|
Chris@16
|
98
|
Chris@16
|
99 #include <boost/asio/detail/pop_options.hpp>
|
Chris@16
|
100
|
Chris@16
|
101 #if defined(BOOST_ASIO_HEADER_ONLY)
|
Chris@16
|
102 # include <boost/asio/detail/impl/posix_thread.ipp>
|
Chris@16
|
103 #endif // defined(BOOST_ASIO_HEADER_ONLY)
|
Chris@16
|
104
|
Chris@16
|
105 #endif // defined(BOOST_ASIO_HAS_PTHREADS)
|
Chris@16
|
106
|
Chris@16
|
107 #endif // BOOST_ASIO_DETAIL_POSIX_THREAD_HPP
|