lockdep: add lockdep_register_ceph_context,cleanup

Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
This commit is contained in:
Colin Patrick McCabe 2011-06-10 10:31:47 -07:00
parent 620d078429
commit 9678ad3fb0
3 changed files with 50 additions and 21 deletions

View File

@ -144,6 +144,7 @@ void common_init(std::vector < const char* >& args,
if (g_lockdep) {
cout << TEXT_YELLOW << "*** lockdep is enabled (" << g_lockdep
<< ") ***" << TEXT_NORMAL << std::endl;
lockdep_register_ceph_context(cct);
}
}

View File

@ -1,3 +1,16 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
*
* Copyright (C) 2008-2011 New Dream Network
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software
* Foundation. See file COPYING.
*
*/
#include "BackTrace.h"
#include "Clock.h"
#include "common/config.h"
@ -7,37 +20,35 @@
#include <ext/hash_map>
/******* Constants **********/
#define DOUT_SUBSYS lockdep
#define MAX_LOCKS 100 // increase me as needed
#define BACKTRACE_SKIP 3
// global
/******* Globals **********/
int g_lockdep = get_env_int("CEPH_LOCKDEP");
// disable lockdep when this module destructs.
struct lockdep_stopper_t {
// disable lockdep when this module destructs.
~lockdep_stopper_t() {
g_lockdep = 0;
}
};
static lockdep_stopper_t lockdep_stopper;
static pthread_mutex_t lockdep_mutex = PTHREAD_MUTEX_INITIALIZER;
static hash_map<const char *, int> lock_ids;
static map<int, const char *> lock_names;
static int last_id = 0;
static hash_map<pthread_t, map<int,BackTrace*> > held;
static BackTrace *follows[MAX_LOCKS][MAX_LOCKS]; // follows[a][b] means b taken after a
static CephContext *g_lockdep_ceph_ctx = NULL;
pthread_mutex_t lockdep_mutex = PTHREAD_MUTEX_INITIALIZER;
#define MAX_LOCKS 100 // increase me as needed
hash_map<const char *, int> lock_ids;
map<int, const char *> lock_names;
int last_id = 0;
hash_map<pthread_t, map<int,BackTrace*> > held;
BackTrace *follows[MAX_LOCKS][MAX_LOCKS]; // follows[a][b] means b taken after a
#define BACKTRACE_SKIP 3
/******* Functions **********/
void lockdep_register_ceph_context(CephContext *cct)
{
pthread_mutex_lock(&lockdep_mutex);
g_lockdep_ceph_ctx = cct;
pthread_mutex_unlock(&lockdep_mutex);
}
int lockdep_dump_locks()
{

View File

@ -1,8 +1,25 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
*
* Copyright (C) 2008-2011 New Dream Network
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software
* Foundation. See file COPYING.
*
*/
#ifndef CEPH_LOCKDEP_H
#define CEPH_LOCKDEP_H
class CephContext;
extern int g_lockdep;
extern void lockdep_register_ceph_context(CephContext *cct);
extern int lockdep_register(const char *n);
extern int lockdep_will_lock(const char *n, int id);
extern int lockdep_locked(const char *n, int id, bool force_backtrace=false);