1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_Monitor_h
8 #define mozilla_Monitor_h
10 #include "mozilla/CondVar.h"
11 #include "mozilla/Mutex.h"
16 * Monitor provides a *non*-reentrant monitor: *not* a Java-style
17 * monitor. If your code needs support for reentrancy, use
18 * ReentrantMonitor instead. (Rarely should reentrancy be needed.)
20 * Instead of directly calling Monitor methods, it's safer and simpler
21 * to instead use the RAII wrappers MonitorAutoLock and
27 explicit Monitor(const char* aName
)
29 , mCondVar(mMutex
, "[Monitor.mCondVar]")
35 void Lock() { mMutex
.Lock(); }
36 void Unlock() { mMutex
.Unlock(); }
38 nsresult
Wait(PRIntervalTime aInterval
= PR_INTERVAL_NO_TIMEOUT
)
40 return mCondVar
.Wait(aInterval
);
43 nsresult
Notify() { return mCondVar
.Notify(); }
44 nsresult
NotifyAll() { return mCondVar
.NotifyAll(); }
46 void AssertCurrentThreadOwns() const
48 mMutex
.AssertCurrentThreadOwns();
51 void AssertNotCurrentThreadOwns() const
53 mMutex
.AssertNotCurrentThreadOwns();
58 Monitor(const Monitor
&);
59 Monitor
& operator=(const Monitor
&);
66 * Lock the monitor for the lexical scope instances of this class are
67 * bound to (except for MonitorAutoUnlock in nested scopes).
69 * The monitor must be unlocked when instances of this class are
72 class MOZ_STACK_CLASS MonitorAutoLock
75 explicit MonitorAutoLock(Monitor
& aMonitor
)
86 nsresult
Wait(PRIntervalTime aInterval
= PR_INTERVAL_NO_TIMEOUT
)
88 return mMonitor
->Wait(aInterval
);
91 nsresult
Notify() { return mMonitor
->Notify(); }
92 nsresult
NotifyAll() { return mMonitor
->NotifyAll(); }
96 MonitorAutoLock(const MonitorAutoLock
&);
97 MonitorAutoLock
& operator=(const MonitorAutoLock
&);
98 static void* operator new(size_t) CPP_THROW_NEW
;
99 static void operator delete(void*);
105 * Unlock the monitor for the lexical scope instances of this class
106 * are bound to (except for MonitorAutoLock in nested scopes).
108 * The monitor must be locked by the current thread when instances of
109 * this class are created.
111 class MOZ_STACK_CLASS MonitorAutoUnlock
114 explicit MonitorAutoUnlock(Monitor
& aMonitor
)
115 : mMonitor(&aMonitor
)
127 MonitorAutoUnlock(const MonitorAutoUnlock
&);
128 MonitorAutoUnlock
& operator=(const MonitorAutoUnlock
&);
129 static void* operator new(size_t) CPP_THROW_NEW
;
130 static void operator delete(void*);
135 } // namespace mozilla
137 #endif // mozilla_Monitor_h