summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency/lock_state.cpp
diff options
context:
space:
mode:
authorGeert Bosch <geert@mongodb.com>2014-12-10 17:15:45 -0500
committerGeert Bosch <geert@mongodb.com>2014-12-12 18:05:34 -0500
commite067fff4e3f3079d070ec168f32c24db9a51a944 (patch)
tree5ccdf8c4cbae815a7d485a30c4d2d5bfbdf3aaaa /src/mongo/db/concurrency/lock_state.cpp
parent2a148f717998b77199c3dd3d7d4e4e47eb1141ef (diff)
downloadmongo-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.cpp18
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>