| Index: third_party/libc++/src/shared_mutex.cpp
|
| ===================================================================
|
| --- third_party/libc++/src/shared_mutex.cpp (revision 0)
|
| +++ third_party/libc++/src/shared_mutex.cpp (revision 0)
|
| @@ -0,0 +1,101 @@
|
| +//===---------------------- shared_mutex.cpp ------------------------------===//
|
| +//
|
| +// The LLVM Compiler Infrastructure
|
| +//
|
| +// This file is dual licensed under the MIT and the University of Illinois Open
|
| +// Source Licenses. See LICENSE.TXT for details.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| +#define _LIBCPP_BUILDING_SHARED_MUTEX
|
| +#include "shared_mutex"
|
| +
|
| +_LIBCPP_BEGIN_NAMESPACE_STD
|
| +
|
| +shared_mutex::shared_mutex()
|
| + : __state_(0)
|
| +{
|
| +}
|
| +
|
| +// Exclusive ownership
|
| +
|
| +void
|
| +shared_mutex::lock()
|
| +{
|
| + unique_lock<mutex> lk(__mut_);
|
| + while (__state_ & __write_entered_)
|
| + __gate1_.wait(lk);
|
| + __state_ |= __write_entered_;
|
| + while (__state_ & __n_readers_)
|
| + __gate2_.wait(lk);
|
| +}
|
| +
|
| +bool
|
| +shared_mutex::try_lock()
|
| +{
|
| + unique_lock<mutex> lk(__mut_);
|
| + if (__state_ == 0)
|
| + {
|
| + __state_ = __write_entered_;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +void
|
| +shared_mutex::unlock()
|
| +{
|
| + lock_guard<mutex> _(__mut_);
|
| + __state_ = 0;
|
| + __gate1_.notify_all();
|
| +}
|
| +
|
| +// Shared ownership
|
| +
|
| +void
|
| +shared_mutex::lock_shared()
|
| +{
|
| + unique_lock<mutex> lk(__mut_);
|
| + while ((__state_ & __write_entered_) || (__state_ & __n_readers_) == __n_readers_)
|
| + __gate1_.wait(lk);
|
| + unsigned num_readers = (__state_ & __n_readers_) + 1;
|
| + __state_ &= ~__n_readers_;
|
| + __state_ |= num_readers;
|
| +}
|
| +
|
| +bool
|
| +shared_mutex::try_lock_shared()
|
| +{
|
| + unique_lock<mutex> lk(__mut_);
|
| + unsigned num_readers = __state_ & __n_readers_;
|
| + if (!(__state_ & __write_entered_) && num_readers != __n_readers_)
|
| + {
|
| + ++num_readers;
|
| + __state_ &= ~__n_readers_;
|
| + __state_ |= num_readers;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +void
|
| +shared_mutex::unlock_shared()
|
| +{
|
| + lock_guard<mutex> _(__mut_);
|
| + unsigned num_readers = (__state_ & __n_readers_) - 1;
|
| + __state_ &= ~__n_readers_;
|
| + __state_ |= num_readers;
|
| + if (__state_ & __write_entered_)
|
| + {
|
| + if (num_readers == 0)
|
| + __gate2_.notify_one();
|
| + }
|
| + else
|
| + {
|
| + if (num_readers == __n_readers_ - 1)
|
| + __gate1_.notify_one();
|
| + }
|
| +}
|
| +
|
| +
|
| +_LIBCPP_END_NAMESPACE_STD
|
|
|
| Property changes on: third_party/libc++/src/shared_mutex.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|