5 // Regular lock-guard policy, lock on ctor, unlock/reset in dtor
7 template< typename LOCK >
8 struct Lock_guard_regular_policy
10 typedef typename LOCK::Status Status;
11 static Status test_and_set(LOCK *l) { return l->test_and_set(); }
12 static void set(LOCK *l, Status s) { l->set(s); }
16 // Inverse lock-guard policy, unlock in ctor, lock in dtor
17 // NOTE: this is applicable only to some locks (e.g., the cpu lock)
19 template<typename LOCK>
20 struct Lock_guard_inverse_policy : private LOCK
22 typedef typename LOCK::Status Status;
23 static Status test_and_set(LOCK *l) { l->clear(); return LOCK::Locked; }
24 static void set(LOCK *l, Status s) { l->set(s); }
29 // Lock_guard: a guard object using a lock such as helping_lock_t
33 template< typename L > class POLICY = Lock_guard_regular_policy >
36 typedef typename cxx::remove_pointer<typename cxx::remove_reference<LOCK>::type>::type Lock;
37 typedef POLICY<Lock> Policy;
40 typename Policy::Status _state;
42 Lock_guard(Lock_guard &) = delete;
43 Lock_guard &operator = (Lock_guard &) = delete;
46 template< typename LOCK>
50 typename LOCK::Status _state1, _state2;
56 PUBLIC template<typename LOCK, template< typename L > class POLICY>
58 Lock_guard<LOCK, POLICY>::Lock_guard()
62 PUBLIC template<typename LOCK, template< typename L > class POLICY>
64 Lock_guard<LOCK, POLICY>::Lock_guard(Lock *l)
67 _state = Policy::test_and_set(_lock);
70 PUBLIC template<typename LOCK, template< typename L > class POLICY>
72 Lock_guard<LOCK, POLICY>::Lock_guard(Lock_guard &&l)
73 : _lock(l._lock), _state(l._state)
78 PUBLIC template<typename LOCK, template< typename L > class POLICY>
80 Lock_guard<LOCK, POLICY>
81 Lock_guard<LOCK, POLICY>::operator = (Lock_guard &&l)
90 inline template<typename LOCK>
91 Lock_guard<LOCK> lock_guard(LOCK &lock)
92 { return Lock_guard<LOCK>(&lock); }
94 inline template<typename LOCK>
95 Lock_guard<LOCK> lock_guard(LOCK *lock)
96 { return Lock_guard<LOCK>(lock); }
98 PUBLIC template<typename LOCK, template< typename L > class POLICY>
101 Lock_guard<LOCK, POLICY>::lock(Lock *l)
104 _state = Policy::test_and_set(l);
107 PUBLIC template<typename LOCK, template< typename L > class POLICY>
110 Lock_guard<LOCK, POLICY>::check_and_lock(Lock *l)
113 _state = Policy::test_and_set(l);
114 return _state != Lock::Invalid;
117 PUBLIC template<typename LOCK, template< typename L > class POLICY>
120 Lock_guard<LOCK, POLICY>::try_lock(Lock *l)
122 _state = Policy::test_and_set(l);
127 case Lock::Not_locked:
128 _lock = l; // Was not locked -- unlock.
131 return false; // Error case -- lock not existent
135 PUBLIC template<typename LOCK, template< typename L > class POLICY>
138 Lock_guard<LOCK, POLICY>::release()
143 PUBLIC template<typename LOCK, template< typename L > class POLICY>
146 Lock_guard<LOCK, POLICY>::reset()
150 Policy::set(_lock, _state);
155 PUBLIC template<typename LOCK, template< typename L > class POLICY>
157 Lock_guard<LOCK, POLICY>::~Lock_guard()
160 Policy::set(_lock, _state);
163 PUBLIC template<typename LOCK, template< typename L > class POLICY>
166 Lock_guard<LOCK, POLICY>::was_set(void)
168 return _state; //!_lock;
171 PUBLIC template<typename LOCK>
173 Lock_guard_2<LOCK>::Lock_guard_2()
177 PUBLIC template<typename LOCK>
179 Lock_guard_2<LOCK>::Lock_guard_2(LOCK *l1, LOCK *l2)
180 : _l1(l1 < l2 ? l1 : l2), _l2(l1 < l2 ? l2 : l1)
182 _state1 = _l1->test_and_set();
186 _state2 = _l2->test_and_set();
190 PUBLIC template<typename LOCK>
193 Lock_guard_2<LOCK>::lock(LOCK *l1, LOCK *l2)
195 _l1 = l1 < l2 ? l1 : l2;
196 _l2 = l1 < l2 ? l2 : l1;
197 _state1 = _l1->test_and_set();
201 _state2 = _l2->test_and_set();
204 PUBLIC template<typename LOCK>
207 Lock_guard_2<LOCK>::check_and_lock(LOCK *l1, LOCK *l2)
209 _l1 = l1 < l2 ? l1 : l2;
210 _l2 = l1 < l2 ? l2 : l1;
211 if ((_state1 = _l1->test_and_set()) == LOCK::Invalid)
219 else if ((_state2 = _l2->test_and_set()) == LOCK::Invalid)
228 PUBLIC template<typename LOCK>
230 Lock_guard_2<LOCK>::~Lock_guard_2()