| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | // (C) Copyright 2012 Vicente Botet////  Distributed under the Boost Software License, Version 1.0. (See accompanying//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_THREAD_LOCKABLE_CONCEPTS_HPP#define BOOST_THREAD_LOCKABLE_CONCEPTS_HPP#include <boost/chrono/chrono.hpp>#include <boost/concept_check.hpp>namespace boost{  /**   * BasicLockable object supports the basic features   * required to delimit a critical region   * Supports the basic lock and unlock functions.   */  //[BasicLockable  template <typename Mutex>  struct BasicLockable  {    BOOST_CONCEPT_USAGE(BasicLockable)    {      l.lock();      l.unlock();    }    BasicLockable() : l(*static_cast<Mutex*>(0)) {}  private:    BasicLockable operator=(BasicLockable const&);    Mutex& l;  }  ;  //]  /**   * Lockable extends BasicLockable   * with try_lock functions.   */  //[Lockable  template <typename Mutex>  struct Lockable  {    BOOST_CONCEPT_ASSERT(( BasicLockable<Mutex> ));    BOOST_CONCEPT_USAGE(Lockable)    {      if (l.try_lock()) return;    }    Lockable() : l(*static_cast<Mutex*>(0)) {}  private:    Lockable operator=(Lockable const&);    Mutex& l;  };  //]  /**   * TimedLockable object extends Lockable   * with timed lock functions: try_lock_until and try_lock_for and the exception based lock_until and lock_for   */  //[TimedLockable  template <typename Mutex>  struct TimedLockable  {    BOOST_CONCEPT_ASSERT(( Lockable<Mutex> ));    BOOST_CONCEPT_USAGE(TimedLockable)    {      if (l.try_lock_until(t)) return;      if (l.try_lock_for(d)) return;    }    TimedLockable() : l(*static_cast<Mutex*>(0)) {}  private:    TimedLockable operator=(TimedLockable const&);    Mutex& l;    chrono::system_clock::time_point t;    chrono::system_clock::duration d;  };  //]  /**   * SharedLockable object extends TimedLockable   * with the lock_shared, lock_shared_until, lock_shared_for, try_lock_shared_until, try_lock_shared   * and unlock_shared functions   */  //[SharedLockable  template <typename Mutex>  struct SharedLockable  {    BOOST_CONCEPT_ASSERT(( TimedLockable<Mutex> ));    BOOST_CONCEPT_USAGE(SharedLockable)    {      l.lock_shared();      l.unlock_shared();      if (l.try_lock_shared()) return;      if (l.try_lock_shared_until(t)) return;      if (l.try_lock_shared_for(d)) return;    }    SharedLockable() : l(*static_cast<Mutex*>(0)) {}  private:    SharedLockable operator=(SharedLockable const&);    Mutex& l;    chrono::system_clock::time_point t;    chrono::system_clock::duration d;  };  //]  /**   * UpgradeLockable object extends SharedLockable   * with the lock_upgrade, lock_upgrade_until, unlock_upgrade_and_lock,   * unlock_and_lock_shared and unlock_upgrade_and_lock_shared functions   */  //[UpgradeLockable  template <typename Mutex>  struct UpgradeLockable  {    BOOST_CONCEPT_ASSERT(( SharedLockable<Mutex> ));    BOOST_CONCEPT_USAGE(UpgradeLockable)    {      l.lock_upgrade();      l.unlock_upgrade();      if (l.try_lock_upgrade()) return;      if (l.try_lock_upgrade_until(t)) return;      if (l.try_lock_upgrade_for(d)) return;      if (l.try_unlock_shared_and_lock()) return;      if (l.try_unlock_shared_and_lock_until(t)) return;      if (l.try_unlock_shared_and_lock_for(d)) return;      l.unlock_and_lock_shared();      if (l.try_unlock_shared_and_lock_upgrade()) return;      if (l.try_unlock_shared_and_lock_upgrade_until(t)) return;      if (l.try_unlock_shared_and_lock_upgrade_for(d)) return;      l.unlock_and_lock_upgrade();      l.unlock_upgrade_and_lock();      if (l.try_unlock_upgrade_and_lock()) return;      if (l.try_unlock_upgrade_and_lock_until(t)) return;      if (l.try_unlock_upgrade_and_lock_for(d)) return;      l.unlock_upgrade_and_lock_shared();    }    UpgradeLockable() : l(*static_cast<Mutex*>(0)) {}  private:    UpgradeLockable operator=(UpgradeLockable const&);    Mutex& l;    chrono::system_clock::time_point t;    chrono::system_clock::duration d;  };  //]}#endif
 |