int leaks = 0;
memory_header_t *hdr;
enumerator_t *enumerator;
- hashtable_t *entries;
+ hashtable_t *entries, *ignored = NULL;
+ backtrace_t *bt;
struct {
/** associated backtrace */
backtrace_t *backtrace;
entries = hashtable_create((hashtable_hash_t)hash,
(hashtable_equals_t)equals, 1024);
+ if (whitelisted)
+ {
+ ignored = hashtable_create((hashtable_hash_t)hash,
+ (hashtable_equals_t)equals, 1024);
+ }
+
lock->lock(lock);
for (hdr = first_header.next; hdr != NULL; hdr = hdr->next)
{
- if (whitelisted &&
- hdr->backtrace->contains_function(hdr->backtrace,
- whitelist, countof(whitelist)))
+ if (whitelisted)
{
- (*whitelisted)++;
- continue;
+ bt = ignored->get(ignored, hdr->backtrace);
+ if (!bt)
+ {
+ if (hdr->backtrace->contains_function(hdr->backtrace, whitelist,
+ countof(whitelist)))
+ {
+ bt = hdr->backtrace;
+ ignored->put(ignored, bt, bt);
+ }
+ }
+ if (bt)
+ {
+ (*whitelisted)++;
+ continue;
+ }
}
entry = entries->get(entries, hdr->backtrace);
if (entry)
leaks++;
}
lock->unlock(lock);
+ DESTROY_IF(ignored);
enumerator = entries->create_enumerator(entries);
while (enumerator->enumerate(enumerator, NULL, &entry))