diff options
Diffstat (limited to 'src/mongo/db/stats/lock_server_status_section.cpp')
-rw-r--r-- | src/mongo/db/stats/lock_server_status_section.cpp | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/src/mongo/db/stats/lock_server_status_section.cpp b/src/mongo/db/stats/lock_server_status_section.cpp index 1e81904b158..7b1350af9c0 100644 --- a/src/mongo/db/stats/lock_server_status_section.cpp +++ b/src/mongo/db/stats/lock_server_status_section.cpp @@ -55,35 +55,28 @@ namespace { int numWaitingWrite = 0; // This returns the blocked lock states - { - boost::lock_guard<boost::mutex> scopedLock(Client::clientsMutex); - - // Count all clients - numTotal = Client::clients.size(); + for (ServiceContext::LockedClientsCursor cursor(txn->getClient()->getServiceContext()); + Client* client = cursor.next();) { - ClientSet::const_iterator it = Client::clients.begin(); - for (; it != Client::clients.end(); it++) { - Client* client = *it; - invariant(client); + invariant(client); + ++numTotal; + boost::unique_lock<Client> uniqueLock(*client); - boost::unique_lock<Client> uniqueLock(*client); + const OperationContext* opCtx = client->getOperationContext(); + if (opCtx == NULL) continue; - const OperationContext* opCtx = client->getOperationContext(); - if (opCtx == NULL) continue; + if (opCtx->lockState()->isWriteLocked()) { + numWriteLocked++; - if (opCtx->lockState()->isWriteLocked()) { - numWriteLocked++; - - if (opCtx->lockState()->getWaitingResource().isValid()) { - numWaitingWrite++; - } + if (opCtx->lockState()->getWaitingResource().isValid()) { + numWaitingWrite++; } - else if (opCtx->lockState()->isReadLocked()) { - numReadLocked++; + } + else if (opCtx->lockState()->isReadLocked()) { + numReadLocked++; - if (opCtx->lockState()->getWaitingResource().isValid()) { - numWaitingRead++; - } + if (opCtx->lockState()->getWaitingResource().isValid()) { + numWaitingRead++; } } } |