CodeMover prototype
[dyninst.git] / external / boost / detail / spinlock_pt.hpp
1 #ifndef BOOST_DETAIL_SPINLOCK_PT_HPP_INCLUDED\r
2 #define BOOST_DETAIL_SPINLOCK_PT_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 <pthread.h>\r
19 \r
20 namespace boost\r
21 {\r
22 \r
23 namespace detail\r
24 {\r
25 \r
26 class spinlock\r
27 {\r
28 public:\r
29 \r
30     pthread_mutex_t v_;\r
31 \r
32 public:\r
33 \r
34     bool try_lock()\r
35     {\r
36         return pthread_mutex_trylock( &v_ ) == 0;\r
37     }\r
38 \r
39     void lock()\r
40     {\r
41         pthread_mutex_lock( &v_ );\r
42     }\r
43 \r
44     void unlock()\r
45     {\r
46         pthread_mutex_unlock( &v_ );\r
47     }\r
48 \r
49 public:\r
50 \r
51     class scoped_lock\r
52     {\r
53     private:\r
54 \r
55         spinlock & sp_;\r
56 \r
57         scoped_lock( scoped_lock const & );\r
58         scoped_lock & operator=( scoped_lock const & );\r
59 \r
60     public:\r
61 \r
62         explicit scoped_lock( spinlock & sp ): sp_( sp )\r
63         {\r
64             sp.lock();\r
65         }\r
66 \r
67         ~scoped_lock()\r
68         {\r
69             sp_.unlock();\r
70         }\r
71     };\r
72 };\r
73 \r
74 } // namespace detail\r
75 } // namespace boost\r
76 \r
77 #define BOOST_DETAIL_SPINLOCK_INIT { PTHREAD_MUTEX_INITIALIZER }\r
78 \r
79 #endif // #ifndef BOOST_DETAIL_SPINLOCK_PT_HPP_INCLUDED\r