Chris@16
|
1 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 //
|
Chris@16
|
3 // (C) Copyright Ion Gaztanaga 2012-2012. Distributed under the Boost
|
Chris@16
|
4 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 //
|
Chris@16
|
7 // See http://www.boost.org/libs/interprocess for documentation.
|
Chris@16
|
8 //
|
Chris@16
|
9 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_INTERPROCESS_DETAIL_LOCKS_HPP
|
Chris@16
|
12 #define BOOST_INTERPROCESS_DETAIL_LOCKS_HPP
|
Chris@16
|
13
|
Chris@101
|
14 #ifndef BOOST_CONFIG_HPP
|
Chris@101
|
15 # include <boost/config.hpp>
|
Chris@101
|
16 #endif
|
Chris@101
|
17 #
|
Chris@101
|
18 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@101
|
19 # pragma once
|
Chris@101
|
20 #endif
|
Chris@101
|
21
|
Chris@16
|
22 #include <boost/interprocess/detail/config_begin.hpp>
|
Chris@16
|
23 #include <boost/interprocess/detail/workaround.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 namespace boost {
|
Chris@16
|
26 namespace interprocess {
|
Chris@16
|
27 namespace ipcdetail {
|
Chris@16
|
28
|
Chris@16
|
29 template<class Lock>
|
Chris@16
|
30 class internal_mutex_lock
|
Chris@16
|
31 {
|
Chris@16
|
32 typedef void (internal_mutex_lock::*unspecified_bool_type)();
|
Chris@16
|
33 public:
|
Chris@16
|
34
|
Chris@16
|
35 typedef typename Lock::mutex_type::internal_mutex_type mutex_type;
|
Chris@101
|
36
|
Chris@16
|
37
|
Chris@16
|
38 internal_mutex_lock(Lock &l)
|
Chris@16
|
39 : l_(l)
|
Chris@16
|
40 {}
|
Chris@16
|
41
|
Chris@16
|
42 mutex_type* mutex() const
|
Chris@16
|
43 { return l_ ? &l_.mutex()->internal_mutex() : 0; }
|
Chris@16
|
44
|
Chris@16
|
45 void lock() { l_.lock(); }
|
Chris@16
|
46
|
Chris@16
|
47 void unlock() { l_.unlock(); }
|
Chris@16
|
48
|
Chris@16
|
49 operator unspecified_bool_type() const
|
Chris@16
|
50 { return l_ ? &internal_mutex_lock::lock : 0; }
|
Chris@16
|
51
|
Chris@16
|
52 private:
|
Chris@16
|
53 Lock &l_;
|
Chris@16
|
54 };
|
Chris@16
|
55
|
Chris@16
|
56 template <class Lock>
|
Chris@16
|
57 class lock_inverter
|
Chris@16
|
58 {
|
Chris@16
|
59 Lock &l_;
|
Chris@16
|
60 public:
|
Chris@16
|
61 lock_inverter(Lock &l)
|
Chris@16
|
62 : l_(l)
|
Chris@16
|
63 {}
|
Chris@16
|
64 void lock() { l_.unlock(); }
|
Chris@16
|
65 void unlock() { l_.lock(); }
|
Chris@16
|
66 };
|
Chris@16
|
67
|
Chris@101
|
68 template <class Lock>
|
Chris@101
|
69 class lock_to_sharable
|
Chris@101
|
70 {
|
Chris@101
|
71 Lock &l_;
|
Chris@101
|
72
|
Chris@101
|
73 public:
|
Chris@101
|
74 explicit lock_to_sharable(Lock &l)
|
Chris@101
|
75 : l_(l)
|
Chris@101
|
76 {}
|
Chris@101
|
77 void lock() { l_.lock_sharable(); }
|
Chris@101
|
78 bool try_lock(){ return l_.try_lock_sharable(); }
|
Chris@101
|
79 void unlock() { l_.unlock_sharable(); }
|
Chris@101
|
80 };
|
Chris@101
|
81
|
Chris@101
|
82 template <class Lock>
|
Chris@101
|
83 class lock_to_wait
|
Chris@101
|
84 {
|
Chris@101
|
85 Lock &l_;
|
Chris@101
|
86
|
Chris@101
|
87 public:
|
Chris@101
|
88 explicit lock_to_wait(Lock &l)
|
Chris@101
|
89 : l_(l)
|
Chris@101
|
90 {}
|
Chris@101
|
91 void lock() { l_.wait(); }
|
Chris@101
|
92 bool try_lock(){ return l_.try_wait(); }
|
Chris@101
|
93 };
|
Chris@101
|
94
|
Chris@16
|
95 } //namespace ipcdetail
|
Chris@16
|
96 } //namespace interprocess
|
Chris@16
|
97 } //namespace boost
|
Chris@16
|
98
|
Chris@16
|
99 #include <boost/interprocess/detail/config_end.hpp>
|
Chris@16
|
100
|
Chris@16
|
101 #endif //BOOST_INTERPROCESS_DETAIL_LOCKS_HPP
|