| 
									
										
										
										
											2009-03-01 16:00:42 +00:00
										 |  |  | #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
					
						
							|  |  |  | #define BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // MS compatible compilers support #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
					
						
							|  |  |  | # pragma once
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2009-03-01 16:00:42 +00:00
										 |  |  | //  yield_k.hpp
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | //  Copyright (c) 2008 Peter Dimov
 | 
					
						
							| 
									
										
										
										
											2014-06-10 22:07:51 -07:00
										 |  |  | //  Copyright (c) Microsoft Corporation 2014
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | //  void yield( unsigned k );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Typical use:
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  for( unsigned k = 0; !try_lock(); ++k ) yield( k );
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  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>
 | 
					
						
							| 
									
										
										
										
											2014-06-10 22:07:51 -07:00
										 |  |  | #include <boost/predef.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if BOOST_PLAT_WINDOWS_RUNTIME
 | 
					
						
							|  |  |  | #include <thread>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-05 15:23:28 +00:00
										 |  |  | // BOOST_SMT_PAUSE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(_MSC_VER) && _MSC_VER >= 1310 && ( defined(_M_IX86) || defined(_M_X64) )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern "C" void _mm_pause(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BOOST_SMT_PAUSE _mm_pause();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-01 16:50:39 +00:00
										 |  |  | #define BOOST_SMT_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" );
 | 
					
						
							| 
									
										
										
										
											2008-04-05 15:23:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-05 15:06:31 +00:00
										 |  |  | #if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if defined( BOOST_USE_WINDOWS_H )
 | 
					
						
							|  |  |  | # include <windows.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace detail | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-11 11:33:03 -07:00
										 |  |  | #if !defined( BOOST_USE_WINDOWS_H ) && !BOOST_PLAT_WINDOWS_RUNTIME
 | 
					
						
							| 
									
										
										
										
											2010-07-10 21:07:05 +00:00
										 |  |  |   extern "C" void __stdcall Sleep( unsigned long ms ); | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-28 20:44:45 +00:00
										 |  |  | inline void yield( unsigned k ) | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     if( k < 4 ) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-04-05 15:23:28 +00:00
										 |  |  | #if defined( BOOST_SMT_PAUSE )
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  |     else if( k < 16 ) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-04-05 15:23:28 +00:00
										 |  |  |         BOOST_SMT_PAUSE | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-06-11 11:33:03 -07:00
										 |  |  | #if !BOOST_PLAT_WINDOWS_RUNTIME
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  |     else if( k < 32 ) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Sleep( 0 ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Sleep( 1 ); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-06-10 22:07:51 -07:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Sleep isn't supported on the Windows Runtime.
 | 
					
						
							|  |  |  |         std::this_thread::yield(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #elif defined( BOOST_HAS_PTHREADS )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <sched.h>
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace detail | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-28 20:44:45 +00:00
										 |  |  | inline void yield( unsigned k ) | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     if( k < 4 ) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-04-05 15:23:28 +00:00
										 |  |  | #if defined( BOOST_SMT_PAUSE )
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  |     else if( k < 16 ) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-04-05 15:23:28 +00:00
										 |  |  |         BOOST_SMT_PAUSE | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     else if( k < 32 || k & 1 ) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         sched_yield(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-04-23 00:33:58 +00:00
										 |  |  |         // g++ -Wextra warns on {} or {0}
 | 
					
						
							|  |  |  |         struct timespec rqtp = { 0, 0 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // POSIX says that timespec has tv_sec and tv_nsec
 | 
					
						
							|  |  |  |         // But it doesn't guarantee order or placement
 | 
					
						
							| 
									
										
										
										
											2008-03-27 22:20:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         rqtp.tv_sec = 0; | 
					
						
							|  |  |  |         rqtp.tv_nsec = 1000; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         nanosleep( &rqtp, 0 ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace detail | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | inline void yield( unsigned ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-01 16:00:42 +00:00
										 |  |  | #endif // #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 |