diff options
author | Geert Bosch <geert@mongodb.com> | 2014-12-10 17:15:45 -0500 |
---|---|---|
committer | Geert Bosch <geert@mongodb.com> | 2014-12-12 18:05:34 -0500 |
commit | e067fff4e3f3079d070ec168f32c24db9a51a944 (patch) | |
tree | 5ccdf8c4cbae815a7d485a30c4d2d5bfbdf3aaaa /src/mongo/db/concurrency/lock_state.cpp | |
parent | 2a148f717998b77199c3dd3d7d4e4e47eb1141ef (diff) | |
download | mongo-e067fff4e3f3079d070ec168f32c24db9a51a944.tar.gz |
SERVER-16493: Have Client own Locker to amortize initialization cost
Diffstat (limited to 'src/mongo/db/concurrency/lock_state.cpp')
-rw-r--r-- | src/mongo/db/concurrency/lock_state.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/mongo/db/concurrency/lock_state.cpp b/src/mongo/db/concurrency/lock_state.cpp index aed2fffe15f..435ed15bb2f 100644 --- a/src/mongo/db/concurrency/lock_state.cpp +++ b/src/mongo/db/concurrency/lock_state.cpp @@ -57,6 +57,9 @@ namespace { // How often (in millis) to check for deadlock if a lock has not been granted for some time const unsigned DeadlockTimeoutMs = 100; + // Dispenses unique LockerId identifiers + AtomicUInt64 idCounter(0); + /** * Used to sort locks by granularity when snapshotting lock state. We must report and reacquire * locks in the same granularity in which they are acquired (i.e. global, flush, database, @@ -176,6 +179,13 @@ namespace { } template<bool IsForMMAPV1> + void LockerImpl<IsForMMAPV1>::assertEmpty() const { + invariant(!inAWriteUnitOfWork()); + invariant(_resourcesToUnlockAtEndOfUnitOfWork.empty()); + invariant(_requests.empty()); + } + + template<bool IsForMMAPV1> void LockerImpl<IsForMMAPV1>::dump() const { StringBuilder ss; ss << "lock status: "; @@ -240,8 +250,8 @@ namespace { // template<bool IsForMMAPV1> - LockerImpl<IsForMMAPV1>::LockerImpl(LockerId id) - : _id(id), + LockerImpl<IsForMMAPV1>::LockerImpl() + : _id(idCounter.addAndFetch(1)), _wuowNestingLevel(0), _batchWriter(false), _lockPendingParallelWriter(false) { @@ -253,9 +263,7 @@ namespace { // Cannot delete the Locker while there are still outstanding requests, because the // LockManager may attempt to access deleted memory. Besides it is probably incorrect // to delete with unaccounted locks anyways. - invariant(!inAWriteUnitOfWork()); - invariant(_resourcesToUnlockAtEndOfUnitOfWork.empty()); - invariant(_requests.empty()); + assertEmpty(); } template<bool IsForMMAPV1> |