1 /******************************************************************************
2   This source file is part of the Avogadro project.
3   This source code is released under the 3-Clause BSD License, (see "LICENSE").
4 ******************************************************************************/
5 
6 #include "sharedmutex.h"
7 
8 #include <shared_mutex>
9 
10 namespace Avogadro {
11 namespace Core {
12 
13 using std::shared_mutex;
14 
15 class SharedMutex::PIMPL
16 {
17 public:
PIMPL()18   PIMPL() {}
19 
20   shared_mutex lock;
21 };
22 
SharedMutex()23 SharedMutex::SharedMutex() : d(new PIMPL) {}
24 
~SharedMutex()25 SharedMutex::~SharedMutex()
26 {
27   delete d;
28 }
29 
lockForRead()30 void SharedMutex::lockForRead()
31 {
32   d->lock.lock_shared();
33 }
34 
tryLockForRead()35 bool SharedMutex::tryLockForRead()
36 {
37   return d->lock.try_lock_shared();
38 }
39 
unlockForRead()40 void SharedMutex::unlockForRead()
41 {
42   d->lock.unlock_shared();
43 }
44 
lockForWrite()45 void SharedMutex::lockForWrite()
46 {
47   d->lock.lock();
48 }
49 
tryLockForWrite()50 bool SharedMutex::tryLockForWrite()
51 {
52   return d->lock.try_lock();
53 }
54 
unlockForWrite()55 void SharedMutex::unlockForWrite()
56 {
57   d->lock.unlock();
58 }
59 
60 } // namespace Core
61 } // namespace Avogadro
62