leak-detective: LEAK_DETECTIVE_DISABLE completely disables LD

If lib->leak_detective is non-null some code parts (e.g. the plugin
loader) assume LD is actually used.
This commit is contained in:
Tobias Brunner
2014-04-03 09:44:26 +02:00
parent 7a61bf9032
commit adc1157487
3 changed files with 23 additions and 17 deletions
+5 -2
View File
@@ -265,8 +265,11 @@ bool library_init(char *settings, const char *namespace)
#ifdef LEAK_DETECTIVE #ifdef LEAK_DETECTIVE
lib->leak_detective = leak_detective_create(); lib->leak_detective = leak_detective_create();
lib->leak_detective->set_report_cb(lib->leak_detective, if (lib->leak_detective)
report_leaks, sum_leaks, NULL); {
lib->leak_detective->set_report_cb(lib->leak_detective,
report_leaks, sum_leaks, NULL);
}
#endif /* LEAK_DETECTIVE */ #endif /* LEAK_DETECTIVE */
pfh = printf_hook_create(); pfh = printf_hook_create();
+9 -6
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2013 Tobias Brunner * Copyright (C) 2013-2014 Tobias Brunner
* Copyright (C) 2006-2013 Martin Willi * Copyright (C) 2006-2013 Martin Willi
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
@@ -973,17 +973,20 @@ leak_detective_t *leak_detective_create()
}, },
); );
if (getenv("LEAK_DETECTIVE_DISABLE") != NULL)
{
free(this);
return NULL;
}
lock = spinlock_create(); lock = spinlock_create();
thread_disabled = thread_value_create(NULL); thread_disabled = thread_value_create(NULL);
init_static_allocations(); init_static_allocations();
if (getenv("LEAK_DETECTIVE_DISABLE") == NULL) if (register_hooks())
{ {
if (register_hooks()) enable_leak_detective();
{
enable_leak_detective();
}
} }
return &this->public; return &this->public;
} }
+9 -9
View File
@@ -50,9 +50,7 @@ typedef void (*leak_detective_summary_cb_t)(void* user, int count, size_t bytes,
int whitelisted); int whitelisted);
/** /**
* Leak detective finds leaks and bad frees using malloc hooks. * Leak detective finds leaks and invalid frees using malloc hooks.
*
* Currently leaks are reported to stderr on destruction.
* *
* @todo Build an API for leak detective, allowing leak enumeration, statistics * @todo Build an API for leak detective, allowing leak enumeration, statistics
* and dynamic whitelisting. * and dynamic whitelisting.
@@ -62,13 +60,12 @@ struct leak_detective_t {
/** /**
* Report leaks to the registered callback functions. * Report leaks to the registered callback functions.
* *
* @param detailed TRUE to resolve line/filename of leak (slow) * @param detailed TRUE to resolve line/filename of leaks (slow)
*/ */
void (*report)(leak_detective_t *this, bool detailed); void (*report)(leak_detective_t *this, bool detailed);
/** /**
* Report current memory usage to out. * Set callback functions invoked when report() is called.
* Set callback functions invoked during a report().
* *
* @param cb callback invoked for each detected leak * @param cb callback invoked for each detected leak
* @param scb summary callback invoked at end of report * @param scb summary callback invoked at end of report
@@ -78,11 +75,11 @@ struct leak_detective_t {
leak_detective_summary_cb_t scb, void *user); leak_detective_summary_cb_t scb, void *user);
/** /**
* Report current memory usage using a callbacks. * Report current memory usage using callback functions.
* *
* @param cb callback invoked for each allocation * @param cb callback invoked for each allocation
* @param scb summary callback invoked at end of usage report * @param scb summary callback invoked at end of usage report
* @param user user data supplied to callbacks * @param user user data to supply to callbacks
*/ */
void (*usage)(leak_detective_t *this, leak_detective_report_cb_t cb, void (*usage)(leak_detective_t *this, leak_detective_report_cb_t cb,
leak_detective_summary_cb_t scb, void *user); leak_detective_summary_cb_t scb, void *user);
@@ -109,7 +106,10 @@ struct leak_detective_t {
}; };
/** /**
* Create a leak_detective instance. * Create a leak_detective instance, unless the LEAK_DETECTIVE_DISABLE
* environment variable is set.
*
* @return leak detective instance
*/ */
leak_detective_t *leak_detective_create(); leak_detective_t *leak_detective_create();