1 #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
2 #define BOOST_SMART_PTR_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 <boost/assert.hpp>
19 
20 #if defined(BOOST_SP_REPORT_IMPLEMENTATION)
21 
22 #include <boost/config/pragma_message.hpp>
23 BOOST_PRAGMA_MESSAGE("Using single-threaded spinlock emulation")
24 
25 #endif
26 
27 namespace boost
28 {
29 
30 namespace detail
31 {
32 
33 class spinlock
34 {
35 public:
36 
37     bool locked_;
38 
39 public:
40 
try_lock()41     inline bool try_lock()
42     {
43         if( locked_ )
44         {
45             return false;
46         }
47         else
48         {
49             locked_ = true;
50             return true;
51         }
52     }
53 
lock()54     inline void lock()
55     {
56         BOOST_ASSERT( !locked_ );
57         locked_ = true;
58     }
59 
unlock()60     inline void unlock()
61     {
62         BOOST_ASSERT( locked_ );
63         locked_ = false;
64     }
65 
66 public:
67 
68     class scoped_lock
69     {
70     private:
71 
72         spinlock & sp_;
73 
74         scoped_lock( scoped_lock const & );
75         scoped_lock & operator=( scoped_lock const & );
76 
77     public:
78 
scoped_lock(spinlock & sp)79         explicit scoped_lock( spinlock & sp ): sp_( sp )
80         {
81             sp.lock();
82         }
83 
~scoped_lock()84         ~scoped_lock()
85         {
86             sp_.unlock();
87         }
88     };
89 };
90 
91 } // namespace detail
92 } // namespace boost
93 
94 #define BOOST_DETAIL_SPINLOCK_INIT { false }
95 
96 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
97