static map<int, int> lock_refs;
static list<int> free_ids;
static ceph::unordered_map<pthread_t, map<int,BackTrace*> > held;
-static BackTrace *follows[MAX_LOCKS][MAX_LOCKS]; // follows[a][b] means b taken after a
+static bool follows[MAX_LOCKS][MAX_LOCKS]; // follows[a][b] means b taken after a
+static BackTrace *follows_bt[MAX_LOCKS][MAX_LOCKS];
static bool lockdep_force_backtrace()
{
// blow away all of our state, too, in case it starts up again.
held.clear();
- for (unsigned i = 0; i < MAX_LOCKS; ++i)
- for (unsigned j = 0; j < MAX_LOCKS; ++j)
- follows[i][j] = NULL;
+ for (unsigned i = 0; i < MAX_LOCKS; ++i) {
+ for (unsigned j = 0; j < MAX_LOCKS; ++j) {
+ follows[i][j] = false;
+ follows_bt[i][j] = NULL;
+ }
+ }
lock_names.clear();
lock_ids.clear();
lock_refs.clear();
if (--refs == 0) {
// reset dependency ordering
for (int i=0; i<MAX_LOCKS; ++i) {
- delete follows[id][i];
- follows[id][i] = NULL;
+ delete follows_bt[id][i];
+ follows_bt[id][i] = NULL;
+ follows[id][i] = false;
- delete follows[i][id];
- follows[i][id] = NULL;
+ delete follows_bt[i][id];
+ follows_bt[i][id] = NULL;
+ follows[i][id] = false;
}
lockdep_dout(10) << "unregistered '" << p->second << "' from " << id
*_dout << "------------------------------------" << "\n";
*_dout << "existing dependency " << lock_names[a] << " (" << a << ") -> "
<< lock_names[b] << " (" << b << ") at:\n";
- follows[a][b]->print(*_dout);
+ if (follows_bt[a][b]) {
+ follows_bt[a][b]->print(*_dout);
+ }
*_dout << dendl;
return true;
}
does_follow(i, b)) {
lockdep_dout(0) << "existing intermediate dependency " << lock_names[a]
<< " (" << a << ") -> " << lock_names[i] << " (" << i << ") at:\n";
- follows[a][i]->print(*_dout);
+ if (follows_bt[a][i]) {
+ follows_bt[a][i]->print(*_dout);
+ }
*_dout << dendl;
return true;
}
if (force_backtrace || lockdep_force_backtrace()) {
bt = new BackTrace(BACKTRACE_SKIP);
}
- follows[p->first][id] = bt;
+ follows[p->first][id] = true;
+ follows_bt[p->first][id] = bt;
lockdep_dout(10) << lock_names[p->first] << " -> " << name << " at" << dendl;
//bt->print(*_dout);
}