1 #ifndef LIBJMMCG_CORE_LOCKING_HPP
2 #define LIBJMMCG_CORE_LOCKING_HPP
25 #include <boost/mpl/assert.hpp>
26 #include <boost/static_assert.hpp>
27 #include <boost/thread/locks.hpp>
33 using lock_traits=LkT;
45 using lock_traits=LkT;
54 using lock_traits=LkT;
85 template<
class LockObject>
124 template<
class LockObject>
169 template<
class LockObject>
216 typename WL=
typename M::write_lock_type,
221 using lock_traits=
typename M::lock_traits;
252 : semaphore(lock_traits::atom_unset), state_(
unsignalled) {
271 return semaphore.set();
280 if (ret==lock_traits::atom_unset) {
286 while (semaphore.try_lock()==lock_traits::atom_set);
307 return semaphore.count();
330 class all :
public std::binary_function<Lk1, Lk2,
void> {
339 BOOST_MPL_ASSERT((
std::is_same<
typename atomic1_t::lock_traits::model_type,
typename atomic2_t::lock_traits::model_type>));
340 BOOST_STATIC_ASSERT(
atomic1_t::lock_traits::api_type==API_);
341 BOOST_MPL_ASSERT((
std::is_same<
typename atomic1_t::lock_traits::model_type, Mdl_>));
366 class all<API_, sequential_mode, Lk1, Lk2> :
public std::binary_function<Lk1, Lk2,
void> {
375 BOOST_MPL_ASSERT((
std::is_same<
typename atomic1_t::lock_traits::model_type,
typename atomic2_t::lock_traits::model_type>));
376 BOOST_STATIC_ASSERT(
atomic1_t::lock_traits::api_type==API_);
377 BOOST_MPL_ASSERT((
std::is_same<
typename atomic1_t::lock_traits::model_type, sequential_mode>));
410 BOOST_MPL_ASSERT((
std::is_same<
typename atomic1_t::lock_traits::model_type,
typename atomic2_t::lock_traits::model_type>));
411 BOOST_STATIC_ASSERT(
atomic1_t::lock_traits::api_type==API_);
412 BOOST_MPL_ASSERT((
std::is_same<
typename atomic1_t::lock_traits::model_type, Mdl_>));