CodeMover prototype
[dyninst.git] / external / boost / detail / spinlock_sync.hpp
1 #ifndef BOOST_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED\r
2 #define BOOST_DETAIL_SPINLOCK_SYNC_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 //  Copyright (c) 2008 Peter Dimov\r
12 //\r
13 //  Distributed under the Boost Software License, Version 1.0.\r
14 //  See accompanying file LICENSE_1_0.txt or copy at\r
15 //  http://www.boost.org/LICENSE_1_0.txt)\r
16 //\r
17 \r
18 #include <boost/detail/yield_k.hpp>\r
19 \r
20 #if defined( __ia64__ ) && defined( __INTEL_COMPILER )\r
21 # include <ia64intrin.h>\r
22 #endif\r
23 \r
24 namespace boost\r
25 {\r
26 \r
27 namespace detail\r
28 {\r
29 \r
30 class spinlock\r
31 {\r
32 public:\r
33 \r
34     int v_;\r
35 \r
36 public:\r
37 \r
38     bool try_lock()\r
39     {\r
40         int r = __sync_lock_test_and_set( &v_, 1 );\r
41         return r == 0;\r
42     }\r
43 \r
44     void lock()\r
45     {\r
46         for( unsigned k = 0; !try_lock(); ++k )\r
47         {\r
48             boost::detail::yield( k );\r
49         }\r
50     }\r
51 \r
52     void unlock()\r
53     {\r
54         __sync_lock_release( &v_ );\r
55     }\r
56 \r
57 public:\r
58 \r
59     class scoped_lock\r
60     {\r
61     private:\r
62 \r
63         spinlock & sp_;\r
64 \r
65         scoped_lock( scoped_lock const & );\r
66         scoped_lock & operator=( scoped_lock const & );\r
67 \r
68     public:\r
69 \r
70         explicit scoped_lock( spinlock & sp ): sp_( sp )\r
71         {\r
72             sp.lock();\r
73         }\r
74 \r
75         ~scoped_lock()\r
76         {\r
77             sp_.unlock();\r
78         }\r
79     };\r
80 };\r
81 \r
82 } // namespace detail\r
83 } // namespace boost\r
84 \r
85 #define BOOST_DETAIL_SPINLOCK_INIT {0}\r
86 \r
87 #endif // #ifndef BOOST_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED\r