Bumping manifests a=b2g-bump
[gecko.git] / xpcom / glue / Monitor.h
blob62e20f58342f428ca8a6e42f5d330f4689ddf9dd
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"
13 namespace mozilla {
15 /**
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
22 * MonitorAutoUnlock.
24 class Monitor
26 public:
27 explicit Monitor(const char* aName)
28 : mMutex(aName)
29 , mCondVar(mMutex, "[Monitor.mCondVar]")
33 ~Monitor() {}
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();
56 private:
57 Monitor();
58 Monitor(const Monitor&);
59 Monitor& operator=(const Monitor&);
61 Mutex mMutex;
62 CondVar mCondVar;
65 /**
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
70 * created.
72 class MOZ_STACK_CLASS MonitorAutoLock
74 public:
75 explicit MonitorAutoLock(Monitor& aMonitor)
76 : mMonitor(&aMonitor)
78 mMonitor->Lock();
81 ~MonitorAutoLock()
83 mMonitor->Unlock();
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(); }
94 private:
95 MonitorAutoLock();
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*);
101 Monitor* mMonitor;
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
113 public:
114 explicit MonitorAutoUnlock(Monitor& aMonitor)
115 : mMonitor(&aMonitor)
117 mMonitor->Unlock();
120 ~MonitorAutoUnlock()
122 mMonitor->Lock();
125 private:
126 MonitorAutoUnlock();
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*);
132 Monitor* mMonitor;
135 } // namespace mozilla
137 #endif // mozilla_Monitor_h