Chris@16
|
1 #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
|
Chris@16
|
2 #define BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
|
Chris@16
|
3
|
Chris@16
|
4 // MS compatible compilers support #pragma once
|
Chris@16
|
5
|
Chris@16
|
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
Chris@16
|
7 # pragma once
|
Chris@16
|
8 #endif
|
Chris@16
|
9
|
Chris@16
|
10 // boost/detail/lightweight_thread.hpp
|
Chris@16
|
11 //
|
Chris@16
|
12 // Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
|
Chris@16
|
13 // Copyright (c) 2008 Peter Dimov
|
Chris@16
|
14 //
|
Chris@16
|
15 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
16 // See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
17 // http://www.boost.org/LICENSE_1_0.txt
|
Chris@16
|
18
|
Chris@16
|
19 #include <boost/config.hpp>
|
Chris@16
|
20 #include <memory>
|
Chris@16
|
21 #include <cerrno>
|
Chris@16
|
22
|
Chris@16
|
23 // pthread_create, pthread_join
|
Chris@16
|
24
|
Chris@16
|
25 #if defined( BOOST_HAS_PTHREADS )
|
Chris@16
|
26
|
Chris@16
|
27 #include <pthread.h>
|
Chris@16
|
28
|
Chris@16
|
29 #else
|
Chris@16
|
30
|
Chris@16
|
31 #include <windows.h>
|
Chris@16
|
32 #include <process.h>
|
Chris@16
|
33
|
Chris@16
|
34 typedef HANDLE pthread_t;
|
Chris@16
|
35
|
Chris@16
|
36 int pthread_create( pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg )
|
Chris@16
|
37 {
|
Chris@16
|
38 HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 );
|
Chris@16
|
39
|
Chris@16
|
40 if( h != 0 )
|
Chris@16
|
41 {
|
Chris@16
|
42 *thread = h;
|
Chris@16
|
43 return 0;
|
Chris@16
|
44 }
|
Chris@16
|
45 else
|
Chris@16
|
46 {
|
Chris@16
|
47 return EAGAIN;
|
Chris@16
|
48 }
|
Chris@16
|
49 }
|
Chris@16
|
50
|
Chris@16
|
51 int pthread_join( pthread_t thread, void ** /*value_ptr*/ )
|
Chris@16
|
52 {
|
Chris@16
|
53 ::WaitForSingleObject( thread, INFINITE );
|
Chris@16
|
54 ::CloseHandle( thread );
|
Chris@16
|
55 return 0;
|
Chris@16
|
56 }
|
Chris@16
|
57
|
Chris@16
|
58 #endif
|
Chris@16
|
59
|
Chris@16
|
60 // template<class F> int lw_thread_create( pthread_t & pt, F f );
|
Chris@16
|
61
|
Chris@16
|
62 namespace boost
|
Chris@16
|
63 {
|
Chris@16
|
64
|
Chris@16
|
65 namespace detail
|
Chris@16
|
66 {
|
Chris@16
|
67
|
Chris@16
|
68 class lw_abstract_thread
|
Chris@16
|
69 {
|
Chris@16
|
70 public:
|
Chris@16
|
71
|
Chris@16
|
72 virtual ~lw_abstract_thread() {}
|
Chris@16
|
73 virtual void run() = 0;
|
Chris@16
|
74 };
|
Chris@16
|
75
|
Chris@16
|
76 #if defined( BOOST_HAS_PTHREADS )
|
Chris@16
|
77
|
Chris@16
|
78 extern "C" void * lw_thread_routine( void * pv )
|
Chris@16
|
79 {
|
Chris@16
|
80 std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
|
Chris@16
|
81
|
Chris@16
|
82 pt->run();
|
Chris@16
|
83
|
Chris@16
|
84 return 0;
|
Chris@16
|
85 }
|
Chris@16
|
86
|
Chris@16
|
87 #else
|
Chris@16
|
88
|
Chris@16
|
89 unsigned __stdcall lw_thread_routine( void * pv )
|
Chris@16
|
90 {
|
Chris@16
|
91 std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
|
Chris@16
|
92
|
Chris@16
|
93 pt->run();
|
Chris@16
|
94
|
Chris@16
|
95 return 0;
|
Chris@16
|
96 }
|
Chris@16
|
97
|
Chris@16
|
98 #endif
|
Chris@16
|
99
|
Chris@16
|
100 template<class F> class lw_thread_impl: public lw_abstract_thread
|
Chris@16
|
101 {
|
Chris@16
|
102 public:
|
Chris@16
|
103
|
Chris@16
|
104 explicit lw_thread_impl( F f ): f_( f )
|
Chris@16
|
105 {
|
Chris@16
|
106 }
|
Chris@16
|
107
|
Chris@16
|
108 void run()
|
Chris@16
|
109 {
|
Chris@16
|
110 f_();
|
Chris@16
|
111 }
|
Chris@16
|
112
|
Chris@16
|
113 private:
|
Chris@16
|
114
|
Chris@16
|
115 F f_;
|
Chris@16
|
116 };
|
Chris@16
|
117
|
Chris@16
|
118 template<class F> int lw_thread_create( pthread_t & pt, F f )
|
Chris@16
|
119 {
|
Chris@16
|
120 std::auto_ptr<lw_abstract_thread> p( new lw_thread_impl<F>( f ) );
|
Chris@16
|
121
|
Chris@16
|
122 int r = pthread_create( &pt, 0, lw_thread_routine, p.get() );
|
Chris@16
|
123
|
Chris@16
|
124 if( r == 0 )
|
Chris@16
|
125 {
|
Chris@16
|
126 p.release();
|
Chris@16
|
127 }
|
Chris@16
|
128
|
Chris@16
|
129 return r;
|
Chris@16
|
130 }
|
Chris@16
|
131
|
Chris@16
|
132 } // namespace detail
|
Chris@16
|
133 } // namespace boost
|
Chris@16
|
134
|
Chris@16
|
135 #endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
|