diff options
author | Remko Tronçon <git@el-tramo.be> | 2010-02-11 12:14:00 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2010-02-11 12:14:00 (GMT) |
commit | 0efa7c32aaf21a29b42b5926cc116007056843be (patch) | |
tree | 882f663a5dd0e65694bf6077b71086dd77fd7ff8 /3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp | |
parent | 1d20eabbc32274b491b4c2bedf73d19933d97bfd (diff) | |
download | swift-contrib-0efa7c32aaf21a29b42b5926cc116007056843be.zip swift-contrib-0efa7c32aaf21a29b42b5926cc116007056843be.tar.bz2 |
Moved some modules into separate git modules.
Diffstat (limited to '3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp')
m--------- | 3rdParty/Boost | 0 | ||||
-rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp | 303 |
2 files changed, 0 insertions, 303 deletions
diff --git a/3rdParty/Boost b/3rdParty/Boost new file mode 160000 +Subproject 3bbdbc8cf1996f23d9a366da8bac0f97be6ad79 diff --git a/3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp b/3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp deleted file mode 100644 index 3ce4e23..0000000 --- a/3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp +++ /dev/null @@ -1,303 +0,0 @@ -#ifndef BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP -#define BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP - -// (C) Copyright 2006-8 Anthony Williams -// -// 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) - -#include <boost/assert.hpp> -#include <boost/static_assert.hpp> -#include <boost/thread/mutex.hpp> -#include <boost/thread/thread.hpp> -#include <boost/thread/condition_variable.hpp> - -#include <boost/config/abi_prefix.hpp> - -namespace boost -{ - class shared_mutex - { - private: - struct state_data - { - unsigned shared_count; - bool exclusive; - bool upgrade; - bool exclusive_waiting_blocked; - }; - - - - state_data state; - boost::mutex state_change; - boost::condition_variable shared_cond; - boost::condition_variable exclusive_cond; - boost::condition_variable upgrade_cond; - - void release_waiters() - { - exclusive_cond.notify_one(); - shared_cond.notify_all(); - } - - - public: - shared_mutex() - { - state_data state_={0,0,0,0}; - state=state_; - } - - ~shared_mutex() - { - } - - void lock_shared() - { - boost::this_thread::disable_interruption do_not_disturb; - boost::mutex::scoped_lock lk(state_change); - - while(state.exclusive || state.exclusive_waiting_blocked) - { - shared_cond.wait(lk); - } - ++state.shared_count; - } - - bool try_lock_shared() - { - boost::mutex::scoped_lock lk(state_change); - - if(state.exclusive || state.exclusive_waiting_blocked) - { - return false; - } - else - { - ++state.shared_count; - return true; - } - } - - bool timed_lock_shared(system_time const& timeout) - { - boost::this_thread::disable_interruption do_not_disturb; - boost::mutex::scoped_lock lk(state_change); - - while(state.exclusive || state.exclusive_waiting_blocked) - { - if(!shared_cond.timed_wait(lk,timeout)) - { - return false; - } - } - ++state.shared_count; - return true; - } - - template<typename TimeDuration> - bool timed_lock_shared(TimeDuration const & relative_time) - { - return timed_lock_shared(get_system_time()+relative_time); - } - - void unlock_shared() - { - boost::mutex::scoped_lock lk(state_change); - bool const last_reader=!--state.shared_count; - - if(last_reader) - { - if(state.upgrade) - { - state.upgrade=false; - state.exclusive=true; - upgrade_cond.notify_one(); - } - else - { - state.exclusive_waiting_blocked=false; - } - release_waiters(); - } - } - - void lock() - { - boost::this_thread::disable_interruption do_not_disturb; - boost::mutex::scoped_lock lk(state_change); - - while(state.shared_count || state.exclusive) - { - state.exclusive_waiting_blocked=true; - exclusive_cond.wait(lk); - } - state.exclusive=true; - } - - bool timed_lock(system_time const& timeout) - { - boost::this_thread::disable_interruption do_not_disturb; - boost::mutex::scoped_lock lk(state_change); - - while(state.shared_count || state.exclusive) - { - state.exclusive_waiting_blocked=true; - if(!exclusive_cond.timed_wait(lk,timeout)) - { - if(state.shared_count || state.exclusive) - { - state.exclusive_waiting_blocked=false; - exclusive_cond.notify_one(); - return false; - } - break; - } - } - state.exclusive=true; - return true; - } - - template<typename TimeDuration> - bool timed_lock(TimeDuration const & relative_time) - { - return timed_lock(get_system_time()+relative_time); - } - - bool try_lock() - { - boost::mutex::scoped_lock lk(state_change); - - if(state.shared_count || state.exclusive) - { - return false; - } - else - { - state.exclusive=true; - return true; - } - - } - - void unlock() - { - boost::mutex::scoped_lock lk(state_change); - state.exclusive=false; - state.exclusive_waiting_blocked=false; - release_waiters(); - } - - void lock_upgrade() - { - boost::this_thread::disable_interruption do_not_disturb; - boost::mutex::scoped_lock lk(state_change); - while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) - { - shared_cond.wait(lk); - } - ++state.shared_count; - state.upgrade=true; - } - - bool timed_lock_upgrade(system_time const& timeout) - { - boost::this_thread::disable_interruption do_not_disturb; - boost::mutex::scoped_lock lk(state_change); - while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) - { - if(!shared_cond.timed_wait(lk,timeout)) - { - if(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) - { - return false; - } - break; - } - } - ++state.shared_count; - state.upgrade=true; - return true; - } - - template<typename TimeDuration> - bool timed_lock_upgrade(TimeDuration const & relative_time) - { - return timed_lock(get_system_time()+relative_time); - } - - bool try_lock_upgrade() - { - boost::mutex::scoped_lock lk(state_change); - if(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) - { - return false; - } - else - { - ++state.shared_count; - state.upgrade=true; - return true; - } - } - - void unlock_upgrade() - { - boost::mutex::scoped_lock lk(state_change); - state.upgrade=false; - bool const last_reader=!--state.shared_count; - - if(last_reader) - { - state.exclusive_waiting_blocked=false; - release_waiters(); - } - } - - void unlock_upgrade_and_lock() - { - boost::this_thread::disable_interruption do_not_disturb; - boost::mutex::scoped_lock lk(state_change); - --state.shared_count; - while(state.shared_count) - { - upgrade_cond.wait(lk); - } - state.upgrade=false; - state.exclusive=true; - } - - void unlock_and_lock_upgrade() - { - boost::mutex::scoped_lock lk(state_change); - state.exclusive=false; - state.upgrade=true; - ++state.shared_count; - state.exclusive_waiting_blocked=false; - release_waiters(); - } - - void unlock_and_lock_shared() - { - boost::mutex::scoped_lock lk(state_change); - state.exclusive=false; - ++state.shared_count; - state.exclusive_waiting_blocked=false; - release_waiters(); - } - - void unlock_upgrade_and_lock_shared() - { - boost::mutex::scoped_lock lk(state_change); - state.upgrade=false; - state.exclusive_waiting_blocked=false; - release_waiters(); - } - }; -} - -#include <boost/config/abi_suffix.hpp> - -#endif |