summaryrefslogtreecommitdiff
path: root/src/mongo/util/concurrency/synchronization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/util/concurrency/synchronization.cpp')
-rw-r--r--src/mongo/util/concurrency/synchronization.cpp139
1 files changed, 69 insertions, 70 deletions
diff --git a/src/mongo/util/concurrency/synchronization.cpp b/src/mongo/util/concurrency/synchronization.cpp
index c3b90019a1b..73c5cd946c2 100644
--- a/src/mongo/util/concurrency/synchronization.cpp
+++ b/src/mongo/util/concurrency/synchronization.cpp
@@ -38,81 +38,80 @@
namespace mongo {
namespace {
- ThreadIdleCallback threadIdleCallback;
-} // namespace
+ThreadIdleCallback threadIdleCallback;
+} // namespace
- void registerThreadIdleCallback(ThreadIdleCallback callback) {
- invariant(!threadIdleCallback);
- threadIdleCallback = callback;
- }
-
- void markThreadIdle() {
- if (!threadIdleCallback) {
- return;
- }
- try {
- threadIdleCallback();
- }
- catch (...) {
- severe() << "Exception escaped from threadIdleCallback";
- fassertFailedNoTrace(28603);
- }
- }
-
- Notification::Notification() {
- lookFor = 1;
- cur = 0;
- }
-
- void Notification::waitToBeNotified() {
- stdx::unique_lock<stdx::mutex> lock( _mutex );
- while ( lookFor != cur )
- _condition.wait(lock);
- lookFor++;
- }
+void registerThreadIdleCallback(ThreadIdleCallback callback) {
+ invariant(!threadIdleCallback);
+ threadIdleCallback = callback;
+}
- void Notification::notifyOne() {
- stdx::lock_guard<stdx::mutex> lock( _mutex );
- verify( cur != lookFor );
- cur++;
- _condition.notify_one();
+void markThreadIdle() {
+ if (!threadIdleCallback) {
+ return;
}
-
- /* --- NotifyAll --- */
-
- NotifyAll::NotifyAll() {
- _lastDone = 0;
- _lastReturned = 0;
- _nWaiting = 0;
+ try {
+ threadIdleCallback();
+ } catch (...) {
+ severe() << "Exception escaped from threadIdleCallback";
+ fassertFailedNoTrace(28603);
}
-
- NotifyAll::When NotifyAll::now() {
- stdx::lock_guard<stdx::mutex> lock( _mutex );
- return ++_lastReturned;
+}
+
+Notification::Notification() {
+ lookFor = 1;
+ cur = 0;
+}
+
+void Notification::waitToBeNotified() {
+ stdx::unique_lock<stdx::mutex> lock(_mutex);
+ while (lookFor != cur)
+ _condition.wait(lock);
+ lookFor++;
+}
+
+void Notification::notifyOne() {
+ stdx::lock_guard<stdx::mutex> lock(_mutex);
+ verify(cur != lookFor);
+ cur++;
+ _condition.notify_one();
+}
+
+/* --- NotifyAll --- */
+
+NotifyAll::NotifyAll() {
+ _lastDone = 0;
+ _lastReturned = 0;
+ _nWaiting = 0;
+}
+
+NotifyAll::When NotifyAll::now() {
+ stdx::lock_guard<stdx::mutex> lock(_mutex);
+ return ++_lastReturned;
+}
+
+void NotifyAll::waitFor(When e) {
+ stdx::unique_lock<stdx::mutex> lock(_mutex);
+ ++_nWaiting;
+ while (_lastDone < e) {
+ _condition.wait(lock);
}
-
- void NotifyAll::waitFor(When e) {
- stdx::unique_lock<stdx::mutex> lock( _mutex );
- ++_nWaiting;
- while( _lastDone < e ) {
- _condition.wait(lock);
- }
+}
+
+void NotifyAll::awaitBeyondNow() {
+ stdx::unique_lock<stdx::mutex> lock(_mutex);
+ ++_nWaiting;
+ When e = ++_lastReturned;
+ while (_lastDone <= e) {
+ _condition.wait(lock);
}
+}
- void NotifyAll::awaitBeyondNow() {
- stdx::unique_lock<stdx::mutex> lock( _mutex );
- ++_nWaiting;
- When e = ++_lastReturned;
- while( _lastDone <= e ) {
- _condition.wait(lock);
- }
- }
-
- void NotifyAll::notifyAll(When e) {
- stdx::unique_lock<stdx::mutex> lock( _mutex );
- _lastDone = e;
- _nWaiting = 0;
- _condition.notify_all();
- }
+void NotifyAll::notifyAll(When e) {
+ stdx::unique_lock<stdx::mutex> lock(_mutex);
+ _lastDone = e;
+ _nWaiting = 0;
+ _condition.notify_all();
+}
-} // namespace mongo
+} // namespace mongo