]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/smart_ptr/detail/yield_k.hpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
7fafea7d38530ebbfef769eac2b02d9d172696de
[canny.git] / stc / exp / ml_stc_linux_make_v1.0 / include / boost / smart_ptr / detail / yield_k.hpp
1 #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED\r
2 #define BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED\r
3 \r
4 // MS compatible compilers support #pragma once\r
5 \r
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)\r
7 # pragma once\r
8 #endif\r
9 \r
10 //\r
11 //  yield_k.hpp\r
12 //\r
13 //  Copyright (c) 2008 Peter Dimov\r
14 //\r
15 //  void yield( unsigned k );\r
16 //\r
17 //  Typical use:\r
18 //\r
19 //  for( unsigned k = 0; !try_lock(); ++k ) yield( k );\r
20 //\r
21 //  Distributed under the Boost Software License, Version 1.0.\r
22 //  See accompanying file LICENSE_1_0.txt or copy at\r
23 //  http://www.boost.org/LICENSE_1_0.txt\r
24 //\r
25 \r
26 #include <boost/config.hpp>\r
27 \r
28 // BOOST_SMT_PAUSE\r
29 \r
30 #if defined(_MSC_VER) && _MSC_VER >= 1310 && ( defined(_M_IX86) || defined(_M_X64) )\r
31 \r
32 extern "C" void _mm_pause();\r
33 #pragma intrinsic( _mm_pause )\r
34 \r
35 #define BOOST_SMT_PAUSE _mm_pause();\r
36 \r
37 #elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )\r
38 \r
39 #define BOOST_SMT_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" );\r
40 \r
41 #endif\r
42 \r
43 //\r
44 \r
45 #if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )\r
46 \r
47 #if defined( BOOST_USE_WINDOWS_H )\r
48 # include <windows.h>\r
49 #endif\r
50 \r
51 namespace boost\r
52 {\r
53 \r
54 namespace detail\r
55 {\r
56 \r
57 #if !defined( BOOST_USE_WINDOWS_H )\r
58   extern "C" void __stdcall Sleep( unsigned ms );\r
59 #endif\r
60 \r
61 inline void yield( unsigned k )\r
62 {\r
63     if( k < 4 )\r
64     {\r
65     }\r
66 #if defined( BOOST_SMT_PAUSE )\r
67     else if( k < 16 )\r
68     {\r
69         BOOST_SMT_PAUSE\r
70     }\r
71 #endif\r
72     else if( k < 32 )\r
73     {\r
74         Sleep( 0 );\r
75     }\r
76     else\r
77     {\r
78         Sleep( 1 );\r
79     }\r
80 }\r
81 \r
82 } // namespace detail\r
83 \r
84 } // namespace boost\r
85 \r
86 #elif defined( BOOST_HAS_PTHREADS )\r
87 \r
88 #include <sched.h>\r
89 #include <time.h>\r
90 \r
91 namespace boost\r
92 {\r
93 \r
94 namespace detail\r
95 {\r
96 \r
97 inline void yield( unsigned k )\r
98 {\r
99     if( k < 4 )\r
100     {\r
101     }\r
102 #if defined( BOOST_SMT_PAUSE )\r
103     else if( k < 16 )\r
104     {\r
105         BOOST_SMT_PAUSE\r
106     }\r
107 #endif\r
108     else if( k < 32 || k & 1 )\r
109     {\r
110         sched_yield();\r
111     }\r
112     else\r
113     {\r
114         // g++ -Wextra warns on {} or {0}\r
115         struct timespec rqtp = { 0, 0 };\r
116 \r
117         // POSIX says that timespec has tv_sec and tv_nsec\r
118         // But it doesn't guarantee order or placement\r
119 \r
120         rqtp.tv_sec = 0;\r
121         rqtp.tv_nsec = 1000;\r
122 \r
123         nanosleep( &rqtp, 0 );\r
124     }\r
125 }\r
126 \r
127 } // namespace detail\r
128 \r
129 } // namespace boost\r
130 \r
131 #else\r
132 \r
133 namespace boost\r
134 {\r
135 \r
136 namespace detail\r
137 {\r
138 \r
139 inline void yield( unsigned )\r
140 {\r
141 }\r
142 \r
143 } // namespace detail\r
144 \r
145 } // namespace boost\r
146 \r
147 #endif\r
148 \r
149 #endif // #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED\r