Files
lightning/common/memleak.h
Rusty Russell c956d9f5eb lightningd: tal memleak detection, dev-memleak command.
This is a primitive mark-and-sweep-style garbage detector.  The core is
in common/ for later use by subdaemons, but for now it's just lightningd.
We initialize it before most other allocations.

We walk the tal tree to get all the pointers, then search the `ld`
object for those pointers, recursing down.  Some specific helpers are
required for hashtables (which stash bits in the unused pointer bits,
so won't be found).

There's `notleak()` for annotating things that aren't leaks: things
like globals and timers, and other semi-transients.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2017-12-20 12:43:10 +01:00

46 lines
1.2 KiB
C

#ifndef LIGHTNING_COMMON_MEMLEAK_H
#define LIGHTNING_COMMON_MEMLEAK_H
#include "config.h"
#include <ccan/tal/tal.h>
#if HAVE_TYPEOF
#define memleak_typeof(var) typeof(var)
#else
#define memleak_typeof(var) void *
#endif /* !HAVE_TYPEOF */
/* Mark a pointer as not being leaked. */
#define notleak(p) ((memleak_typeof(p))notleak_(p))
#if DEVELOPER
void *notleak_(const void *ptr);
struct htable;
/* Initialize memleak detection, with this as the root */
void memleak_init(const tal_t *root);
/* Free memleak detection. */
void memleak_cleanup(void);
/* Allocate a htable with all the memory we've allocated. */
struct htable *memleak_enter_allocations(const tal_t *ctx, const void *exclude);
/* Remove any pointers to memory under root */
void memleak_remove_referenced(struct htable *memtable, const void *root);
/* Mark this pointer as being referenced, and search within for more. */
void memleak_scan_region(struct htable *memtable, const void *p);
/* Get (and remove) a leak from memtable, or NULL */
const void *memleak_get(struct htable *memtable);
#else /* ... !DEVELOPER */
static inline void *notleak_(const void *ptr)
{
return ptr;
}
#endif /* !DEVELOPER */
#endif /* LIGHTNING_COMMON_MEMLEAK_H */