static multimap<ceph_filelock, ceph_lock_state_t*> global_waiting_locks;
+static void remove_global_waiting(ceph_filelock &fl, ceph_lock_state_t *lock_state)
+{
+ for (auto p = global_waiting_locks.find(fl);
+ p != global_waiting_locks.end(); ) {
+ if (p->first != fl)
+ break;
+ if (p->second == lock_state) {
+ global_waiting_locks.erase(p);
+ break;
+ }
+ ++p;
+ }
+}
+
ceph_lock_state_t::~ceph_lock_state_t()
{
if (type == CEPH_LOCK_FCNTL) {
for (auto p = waiting_locks.begin(); p != waiting_locks.end(); ++p) {
- for (auto q = global_waiting_locks.find(p->second);
- q != global_waiting_locks.end(); ) {
- if (q->first != p->second)
- break;
- if (q->second == this) {
- global_waiting_locks.erase(q);
- break;
- }
- ++q;
- }
+ remove_global_waiting(p->second, this);
}
}
}
break;
if (p->second.length == fl.length &&
ceph_filelock_owner_equal(p->second, fl)) {
+ if (type == CEPH_LOCK_FCNTL) {
+ remove_global_waiting(p->second, this);
+ }
waiting_locks.erase(p);
--client_waiting_lock_counts[(client_t)fl.client];
if (!client_waiting_lock_counts[(client_t)fl.client]) {
}
++p;
}
-
- if (type == CEPH_LOCK_FCNTL) {
- for (auto q = global_waiting_locks.find(fl);
- q != global_waiting_locks.end(); ) {
- if (q->first != fl)
- break;
- if (q->second == this) {
- global_waiting_locks.erase(q);
- break;
- }
- ++q;
- }
- }
}
bool ceph_lock_state_t::is_deadlock(const ceph_filelock& fl,
++iter;
continue;
}
-
- for (auto p = global_waiting_locks.find(iter->second);
- p != global_waiting_locks.end(); ) {
- if (p->first != iter->second)
- break;
- if (p->second == this) {
- global_waiting_locks.erase(p);
- break;
- }
- ++p;
+ if (type == CEPH_LOCK_FCNTL) {
+ remove_global_waiting(iter->second, this);
}
waiting_locks.erase(iter++);
}