From: Sage Weil Date: Mon, 3 Nov 2008 20:37:24 +0000 (-0800) Subject: lockdep: faster X-Git-Tag: v0.5~107 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4bcaba428c6b924e4c4f710f3dbf04611aa148f2;p=ceph.git lockdep: faster --- diff --git a/src/common/Mutex.cc b/src/common/Mutex.cc index c80b81e4cbd9..b6a45b089180 100644 --- a/src/common/Mutex.cc +++ b/src/common/Mutex.cc @@ -23,7 +23,7 @@ pthread_mutex_t lockdep_mutex = PTHREAD_MUTEX_INITIALIZER; #define MAX_LOCKS 100 // increase me as needed hash_map lock_ids; -vector lock_names(MAX_LOCKS); +map lock_names; int last_id = 0; @@ -46,12 +46,13 @@ void Mutex::_register() hash_map::iterator p = lock_ids.find(name); if (p == lock_ids.end()) { + assert(last_id < MAX_LOCKS); id = last_id++; lock_ids[name] = id; lock_names[id] = name; dout(10) << "registered '" << name << "' as " << id << std::endl; - assert(last_id <= MAX_LOCKS); } else { + dout(20) << "had '" << name << "' as " << id << std::endl; id = p->second; } @@ -63,8 +64,9 @@ void Mutex::_register() bool does_follow(int a, int b) { if (follows[a][b]) { + *_dout << std::endl; dout(0) << "------------------------------------" << std::endl; - dout(0) << "existing dependency " << lock_names[a] << " -> " << lock_names[b] << " at: " << std::endl; + dout(0) << "existing dependency " << lock_names[a] << " (" << a << ") -> " << lock_names[b] << " (" << b << ") at: " << std::endl; follows[a][b]->print(*_dout); *_dout << std::endl; return true; @@ -73,7 +75,7 @@ bool does_follow(int a, int b) for (int i=0; i " << lock_names[i] << " at:" << std::endl; + dout(0) << "existing intermediate dependency " << lock_names[a] << " (" << a << ") -> " << lock_names[i] << " (" << i << ") at:" << std::endl; follows[a][i]->print(*_dout); *_dout << std::endl; return true; @@ -86,9 +88,10 @@ bool does_follow(int a, int b) void Mutex::_will_lock() { pthread_t p = pthread_self(); + if (id < 0) _register(); pthread_mutex_lock(&lockdep_mutex); - dout(20) << "_will_lock " << name << std::endl; + dout(20) << "_will_lock " << name << " (" << id << ")" << std::endl; // check dependency graph map &m = held[p]; @@ -101,7 +104,7 @@ void Mutex::_will_lock() // did we just create a cycle? BackTrace *bt = new BackTrace(BACKTRACE_SKIP); if (does_follow(id, p->first)) { - dout(0) << "new dependency " << lock_names[p->first] << " -> " << name + dout(0) << "new dependency " << lock_names[p->first] << " (" << p->first << ") -> " << name << " (" << id << ")" << " creates a cycle at" << std::endl; bt->print(*_dout); @@ -111,7 +114,7 @@ void Mutex::_will_lock() for (map::iterator q = m.begin(); q != m.end(); q++) { - dout(0) << " " << lock_names[q->first] << std::endl; + dout(0) << " " << lock_names[q->first] << " (" << q->first << ")" << std::endl; if (g_lockdep >= 2) { q->second->print(*_dout); *_dout << std::endl; @@ -123,6 +126,8 @@ void Mutex::_will_lock() // don't add this dependency, or we'll get aMutex. cycle in the graph, and // does_follow() won't terminate. + + assert(0); // actually, we should just die here. } else { follows[p->first][id] = bt; dout(10) << lock_names[p->first] << " -> " << name << " at" << std::endl; @@ -138,6 +143,8 @@ void Mutex::_locked() { pthread_t p = pthread_self(); + if (id < 0) _register(); + pthread_mutex_lock(&lockdep_mutex); dout(20) << "_locked " << name << std::endl; if (g_lockdep >= 2) @@ -151,10 +158,15 @@ void Mutex::_unlocked() { pthread_t p = pthread_self(); + if (id < 0) _register(); + pthread_mutex_lock(&lockdep_mutex); dout(20) << "_unlocked " << name << std::endl; - assert(held.count(p)); - assert(held[p].count(id)); + + // don't assert.. lockdep may be enabled at any point in time + //assert(held.count(p)); + //assert(held[p].count(id)); + delete held[p][id]; held[p].erase(id); pthread_mutex_unlock(&lockdep_mutex); diff --git a/src/common/Mutex.h b/src/common/Mutex.h index 757e1b561e87..0b2906316e7b 100755 --- a/src/common/Mutex.h +++ b/src/common/Mutex.h @@ -50,7 +50,7 @@ private: #endif public: - Mutex(const char *n, bool r = true, bool ld=true) : name(n), recursive(r), lockdep(ld), nlock(0) { + Mutex(const char *n, bool r = true, bool ld=true) : name(n), id(-1), recursive(r), lockdep(ld), nlock(0) { if (recursive) { pthread_mutexattr_t attr; pthread_mutexattr_init(&attr);