Chris@16: #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED Chris@16: #define BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: // boost/detail/lightweight_thread.hpp Chris@16: // Chris@16: // Copyright (c) 2002 Peter Dimov and Multi Media Ltd. Chris@16: // Copyright (c) 2008 Peter Dimov Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // pthread_create, pthread_join Chris@16: Chris@16: #if defined( BOOST_HAS_PTHREADS ) Chris@16: Chris@16: #include Chris@16: Chris@16: #else Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: typedef HANDLE pthread_t; Chris@16: Chris@16: int pthread_create( pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg ) Chris@16: { Chris@16: HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 ); Chris@16: Chris@16: if( h != 0 ) Chris@16: { Chris@16: *thread = h; Chris@16: return 0; Chris@16: } Chris@16: else Chris@16: { Chris@16: return EAGAIN; Chris@16: } Chris@16: } Chris@16: Chris@16: int pthread_join( pthread_t thread, void ** /*value_ptr*/ ) Chris@16: { Chris@16: ::WaitForSingleObject( thread, INFINITE ); Chris@16: ::CloseHandle( thread ); Chris@16: return 0; Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: // template int lw_thread_create( pthread_t & pt, F f ); Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: class lw_abstract_thread Chris@16: { Chris@16: public: Chris@16: Chris@16: virtual ~lw_abstract_thread() {} Chris@16: virtual void run() = 0; Chris@16: }; Chris@16: Chris@16: #if defined( BOOST_HAS_PTHREADS ) Chris@16: Chris@16: extern "C" void * lw_thread_routine( void * pv ) Chris@16: { Chris@16: std::auto_ptr pt( static_cast( pv ) ); Chris@16: Chris@16: pt->run(); Chris@16: Chris@16: return 0; Chris@16: } Chris@16: Chris@16: #else Chris@16: Chris@16: unsigned __stdcall lw_thread_routine( void * pv ) Chris@16: { Chris@16: std::auto_ptr pt( static_cast( pv ) ); Chris@16: Chris@16: pt->run(); Chris@16: Chris@16: return 0; Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: template class lw_thread_impl: public lw_abstract_thread Chris@16: { Chris@16: public: Chris@16: Chris@16: explicit lw_thread_impl( F f ): f_( f ) Chris@16: { Chris@16: } Chris@16: Chris@16: void run() Chris@16: { Chris@16: f_(); Chris@16: } Chris@16: Chris@16: private: Chris@16: Chris@16: F f_; Chris@16: }; Chris@16: Chris@16: template int lw_thread_create( pthread_t & pt, F f ) Chris@16: { Chris@16: std::auto_ptr p( new lw_thread_impl( f ) ); Chris@16: Chris@16: int r = pthread_create( &pt, 0, lw_thread_routine, p.get() ); Chris@16: Chris@16: if( r == 0 ) Chris@16: { Chris@16: p.release(); Chris@16: } Chris@16: Chris@16: return r; Chris@16: } Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace boost Chris@16: Chris@16: #endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED