diff options
Diffstat (limited to 'src/mongo/util/concurrency/synchronization.cpp')
-rw-r--r-- | src/mongo/util/concurrency/synchronization.cpp | 139 |
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 |