fixing stuff
[dyninst.git] / dynutil / h / dyn_detail / boost / detail / spinlock_nt.hpp
1 #ifndef DYN_DETAIL_BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED
2 #define DYN_DETAIL_BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED
3
4 // MS compatible compilers support #pragma once
5
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
7 # pragma once
8 #endif
9
10 //
11 //  Copyright (c) 2008 Peter Dimov
12 //
13 //  Distributed under the Boost Software License, Version 1.0.
14 //  See accompanying file LICENSE_1_0.txt or copy at
15 //  http://www.boost.org/LICENSE_1_0.txt)
16 //
17
18 #include <dyn_detail/boost/assert.hpp>
19
20 namespace dyn_detail
21 {
22   
23 namespace boost
24 {
25
26 namespace detail
27 {
28
29 class spinlock
30 {
31 public:
32
33     bool locked_;
34
35 public:
36
37     inline bool try_lock()
38     {
39         if( locked_ )
40         {
41             return false;
42         }
43         else
44         {
45             locked_ = true;
46             return true;
47         }
48     }
49
50     inline void lock()
51     {
52         DYN_DETAIL_BOOST_ASSERT( !locked_ );
53         locked_ = true;
54     }
55
56     inline void unlock()
57     {
58         DYN_DETAIL_BOOST_ASSERT( locked_ );
59         locked_ = false;
60     }
61
62 public:
63
64     class scoped_lock
65     {
66     private:
67
68         spinlock & sp_;
69
70         scoped_lock( scoped_lock const & );
71         scoped_lock & operator=( scoped_lock const & );
72
73     public:
74
75         explicit scoped_lock( spinlock & sp ): sp_( sp )
76         {
77             sp.lock();
78         }
79
80         ~scoped_lock()
81         {
82             sp_.unlock();
83         }
84     };
85 };
86
87 } // namespace detail
88 } // namespace boost
89 } // namespace dyn_detail
90
91 #define DYN_DETAIL_BOOST_DETAIL_SPINLOCK_INIT { false }
92
93 #endif // #ifndef DYN_DETAIL_BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED