You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
135 lines
2.3 KiB
135 lines
2.3 KiB
#ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED |
|
#define BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED |
|
|
|
// MS compatible compilers support #pragma once |
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020) |
|
# pragma once |
|
#endif |
|
|
|
// boost/detail/lightweight_thread.hpp |
|
// |
|
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd. |
|
// Copyright (c) 2008 Peter Dimov |
|
// |
|
// 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 |
|
|
|
#include <boost/config.hpp> |
|
#include <memory> |
|
#include <cerrno> |
|
|
|
// pthread_create, pthread_join |
|
|
|
#if defined( BOOST_HAS_PTHREADS ) |
|
|
|
#include <pthread.h> |
|
|
|
#else |
|
|
|
#include <windows.h> |
|
#include <process.h> |
|
|
|
typedef HANDLE pthread_t; |
|
|
|
int pthread_create( pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg ) |
|
{ |
|
HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 ); |
|
|
|
if( h != 0 ) |
|
{ |
|
*thread = h; |
|
return 0; |
|
} |
|
else |
|
{ |
|
return EAGAIN; |
|
} |
|
} |
|
|
|
int pthread_join( pthread_t thread, void ** /*value_ptr*/ ) |
|
{ |
|
::WaitForSingleObject( thread, INFINITE ); |
|
::CloseHandle( thread ); |
|
return 0; |
|
} |
|
|
|
#endif |
|
|
|
// template<class F> int lw_thread_create( pthread_t & pt, F f ); |
|
|
|
namespace boost |
|
{ |
|
|
|
namespace detail |
|
{ |
|
|
|
class lw_abstract_thread |
|
{ |
|
public: |
|
|
|
virtual ~lw_abstract_thread() {} |
|
virtual void run() = 0; |
|
}; |
|
|
|
#if defined( BOOST_HAS_PTHREADS ) |
|
|
|
extern "C" void * lw_thread_routine( void * pv ) |
|
{ |
|
std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) ); |
|
|
|
pt->run(); |
|
|
|
return 0; |
|
} |
|
|
|
#else |
|
|
|
unsigned __stdcall lw_thread_routine( void * pv ) |
|
{ |
|
std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) ); |
|
|
|
pt->run(); |
|
|
|
return 0; |
|
} |
|
|
|
#endif |
|
|
|
template<class F> class lw_thread_impl: public lw_abstract_thread |
|
{ |
|
public: |
|
|
|
explicit lw_thread_impl( F f ): f_( f ) |
|
{ |
|
} |
|
|
|
void run() |
|
{ |
|
f_(); |
|
} |
|
|
|
private: |
|
|
|
F f_; |
|
}; |
|
|
|
template<class F> int lw_thread_create( pthread_t & pt, F f ) |
|
{ |
|
std::auto_ptr<lw_abstract_thread> p( new lw_thread_impl<F>( f ) ); |
|
|
|
int r = pthread_create( &pt, 0, lw_thread_routine, p.get() ); |
|
|
|
if( r == 0 ) |
|
{ |
|
p.release(); |
|
} |
|
|
|
return r; |
|
} |
|
|
|
} // namespace detail |
|
} // namespace boost |
|
|
|
#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
|
|
|