#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 |