$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: pdimov_at_[hidden]
Date: 2008-03-27 18:20:12
Author: pdimov
Date: 2008-03-27 18:20:11 EDT (Thu, 27 Mar 2008)
New Revision: 43888
URL: http://svn.boost.org/trac/boost/changeset/43888
Log:
detail::yield(k) added.
Added:
   trunk/boost/detail/yield_k.hpp   (contents, props changed)
   trunk/libs/smart_ptr/test/yield_k_test.cpp   (contents, props changed)
Text files modified: 
   trunk/libs/smart_ptr/test/Jamfile.v2 |     1 +                                       
   1 files changed, 1 insertions(+), 0 deletions(-)
Added: trunk/boost/detail/yield_k.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/detail/yield_k.hpp	2008-03-27 18:20:11 EDT (Thu, 27 Mar 2008)
@@ -0,0 +1,132 @@
+#ifndef BOOST_DETAIL_YIELD_K_HPP_INCLUDED
+#define BOOST_DETAIL_YIELD_K_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/detail/yield_k.hpp
+//
+//  Copyright (c) 2008 Peter Dimov
+//
+//  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>
+
+#if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ )
+
+#if defined( BOOST_USE_WINDOWS_H )
+# include <windows.h>
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER >= 1310
+  extern "C" void _mm_pause();
+#endif
+
+namespace boost
+{
+
+namespace detail
+{
+
+#if !defined( BOOST_USE_WINDOWS_H )
+  extern "C" void __stdcall Sleep( unsigned ms );
+#endif
+
+void yield( unsigned k )
+{
+    if( k < 4 )
+    {
+    }
+#if defined(_MSC_VER) && _MSC_VER >= 1310
+    else if( k < 16 )
+    {
+        _mm_pause();
+    }
+#endif
+    else if( k < 32 )
+    {
+        Sleep( 0 );
+    }
+    else
+    {
+        Sleep( 1 );
+    }
+}
+
+} // namespace detail
+
+} // namespace boost
+
+#elif defined( BOOST_HAS_PTHREADS )
+
+#include <sched.h>
+#include <time.h>
+
+namespace boost
+{
+
+namespace detail
+{
+
+void yield( unsigned k )
+{
+    if( k < 4 )
+    {
+    }
+#if defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )
+    else if( k < 16 )
+    {
+        __asm__ __volatile__( "rep; nop" ::: "memory" );
+    }
+#endif
+    else if( k < 32 || k & 1 )
+    {
+        sched_yield();
+    }
+    else
+    {
+        struct timespec rqtp = { 0 };
+
+        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
+
+#endif // #ifndef BOOST_DETAIL_YIELD_K_HPP_INCLUDED
Modified: trunk/libs/smart_ptr/test/Jamfile.v2
==============================================================================
--- trunk/libs/smart_ptr/test/Jamfile.v2	(original)
+++ trunk/libs/smart_ptr/test/Jamfile.v2	2008-03-27 18:20:11 EDT (Thu, 27 Mar 2008)
@@ -37,5 +37,6 @@
           [ compile-fail scoped_array_eq_fail.cpp ]
           [ run esft_regtest.cpp ]
           [ run esft_constructor_test.cpp ]
+          [ run yield_k_test.cpp ]
         ;
 }
Added: trunk/libs/smart_ptr/test/yield_k_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/smart_ptr/test/yield_k_test.cpp	2008-03-27 18:20:11 EDT (Thu, 27 Mar 2008)
@@ -0,0 +1,23 @@
+//
+// yield_k_test.cpp
+//
+// Copyright 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/detail/yield_k.hpp>
+
+// Sanity check only
+
+int main()
+{
+    for( unsigned k = 0; k < 256; ++k )
+    {
+        boost::detail::yield( k );
+    }
+
+    return 0;
+}