| 103 | } |
| 104 | |
| 105 | ReentrantLockManager::LockGuard ReentrantLockManager::writeLock(uint64_t id) { |
| 106 | auto guard = folly::makeGuard( |
| 107 | [now = std::chrono::steady_clock::now()] { writeLockLatency.addSample(std::chrono::steady_clock::now() - now); }); |
| 108 | |
| 109 | auto &shard = getShard(id); |
| 110 | auto lock = std::unique_lock(shard.mutex); |
| 111 | auto &status = shard.map[id]; |
| 112 | |
| 113 | if (!status.readyToWriteLock()) { |
| 114 | auto start = std::chrono::steady_clock::now(); |
| 115 | ++status.waitingWriteLock; |
| 116 | shard.writeCond.wait(lock, [&] { return shard.map[id].readyToWriteLock(); }); |
| 117 | --status.waitingWriteLock; |
| 118 | auto elapsed = std::chrono::steady_clock::now() - start; |
| 119 | writeLockWaitingLatency.addSample(elapsed); |
| 120 | } |
| 121 | status.writeLock(); |
| 122 | return LockGuard(this, id, LockType::WRITE); |
| 123 | } |
| 124 | |
| 125 | ReentrantLockManager::LockGuard ReentrantLockManager::tryWriteLock(uint64_t id) { |
| 126 | auto &shard = getShard(id); |