summaryrefslogtreecommitdiff
path: root/src/mongo/db/stats/lock_server_status_section.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/stats/lock_server_status_section.cpp')
-rw-r--r--src/mongo/db/stats/lock_server_status_section.cpp39
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++;
}
}
}