12 #ifndef ROOT_TVirtualRWMutex
13 #define ROOT_TVirtualRWMutex
31 class TVirtualRWMutex;
36 R__EXTERN TVirtualRWMutex *gCoreMutex;
38 class TVirtualRWMutex :
public TVirtualMutex {
58 virtual ~StateDelta();
61 virtual Hint_t *ReadLock() = 0;
62 virtual void ReadUnLock(Hint_t *) = 0;
63 virtual Hint_t *WriteLock() = 0;
64 virtual void WriteUnLock(Hint_t *) = 0;
66 Int_t Lock()
override { WriteLock();
return 1; }
67 Int_t TryLock()
override { WriteLock();
return 1; }
68 Int_t UnLock()
override { WriteUnLock(
nullptr);
return 1; }
69 Int_t CleanUp()
override { WriteUnLock(
nullptr);
return 1; }
71 virtual std::unique_ptr<State> GetStateBefore() = 0;
72 virtual std::unique_ptr<StateDelta> Rewind(
const State& earlierState) = 0;
73 virtual void Apply(std::unique_ptr<StateDelta> &&delta) = 0;
75 TVirtualRWMutex *Factory(Bool_t = kFALSE)
override = 0;
77 ClassDefOverride(TVirtualRWMutex, 0)
96 class TReadLockGuard {
99 TVirtualRWMutex *
const fMutex;
100 TVirtualRWMutex::Hint_t *fHint;
102 TReadLockGuard(
const TReadLockGuard&) =
delete;
103 TReadLockGuard& operator=(
const TReadLockGuard&) =
delete;
106 TReadLockGuard(TVirtualRWMutex *mutex) : fMutex(mutex), fHint(nullptr) {
107 if (fMutex) fHint = fMutex->ReadLock();
110 ~TReadLockGuard() {
if (fMutex) fMutex->ReadUnLock(fHint); }
112 ClassDefNV(TReadLockGuard,0)
115 class TWriteLockGuard {
118 TVirtualRWMutex *
const fMutex;
119 TVirtualRWMutex::Hint_t *fHint;
121 TWriteLockGuard(
const TWriteLockGuard&) =
delete;
122 TWriteLockGuard& operator=(
const TWriteLockGuard&) =
delete;
125 TWriteLockGuard(TVirtualRWMutex *mutex) : fMutex(mutex), fHint(nullptr) {
126 if (fMutex) fHint = fMutex->WriteLock();
129 ~TWriteLockGuard() {
if (fMutex) fMutex->WriteUnLock(fHint); }
131 ClassDefNV(TWriteLockGuard,0)
137 #if defined (_REENTRANT) || defined (WIN32)
139 #define R__READ_LOCKGUARD(mutex) ::ROOT::TReadLockGuard _R__UNIQUE_(R__readguard)(mutex)
140 #define R__READ_LOCKGUARD_NAMED(name,mutex) ::ROOT::TReadLockGuard _NAME2_(R__readguard,name)(mutex)
142 #define R__WRITE_LOCKGUARD(mutex) ::ROOT::TWriteLockGuard _R__UNIQUE_(R__readguard)(mutex)
143 #define R__WRITE_LOCKGUARD_NAMED(name,mutex) ::ROOT::TWriteLockGuard _NAME2_(R__readguard,name)(mutex)
147 #define R__READ_LOCKGUARD(mutex) (void)mutex
148 #define R__READ_LOCKGUARD_NAMED(name,mutex) (void)mutex
150 #define R__WRITE_LOCKGUARD(mutex) (void)mutex
151 #define R__WRITE_LOCKGUARD_NAMED(name,mutex) (void)mutex