diff options
author | Lennart Poettering <lennart@poettering.net> | 2009-03-25 02:42:18 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2009-03-25 02:42:18 +0100 |
commit | e41ec51f1bdefe44c7104ce27130999600b7911e (patch) | |
tree | 50ac8b6726b59ce7290668ffbeabc2c7ebd5cf70 /src/pulsecore/refcnt.h | |
parent | 577259bb15ebf3ddc0586476b5f945b055895ba5 (diff) |
add simple ref counting debugging framework
Diffstat (limited to 'src/pulsecore/refcnt.h')
-rw-r--r-- | src/pulsecore/refcnt.h | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/src/pulsecore/refcnt.h b/src/pulsecore/refcnt.h index 1e988326..782436b5 100644 --- a/src/pulsecore/refcnt.h +++ b/src/pulsecore/refcnt.h @@ -23,23 +23,59 @@ ***/ #include <pulsecore/atomic.h> +#include <pulsecore/macro.h> +#include <pulsecore/log.h> + +/* #define DEBUG_REF */ #define PA_REFCNT_DECLARE \ pa_atomic_t _ref -#define PA_REFCNT_INIT(p) \ - pa_atomic_store(&(p)->_ref, 1) +#define PA_REFCNT_VALUE(p) \ + pa_atomic_load(&(p)->_ref) #define PA_REFCNT_INIT_ZERO(p) \ pa_atomic_store(&(p)->_ref, 0) +#ifndef DEBUG_REF + +#define PA_REFCNT_INIT(p) \ + pa_atomic_store(&(p)->_ref, 1) + #define PA_REFCNT_INC(p) \ pa_atomic_inc(&(p)->_ref) #define PA_REFCNT_DEC(p) \ (pa_atomic_dec(&(p)->_ref)-1) -#define PA_REFCNT_VALUE(p) \ - pa_atomic_load(&(p)->_ref) +#else + +/* If you need to debug ref counting problems define DEBUG_REF and + * set $PULSE_LOG_BACKTRACE=5 or suchlike in the shell when running + * PA */ + +#define PA_REFCNT_INIT(p) \ + do { \ + pa_atomic_store(&(p)->_ref, 1); \ + pa_log("REF: Init %p", p); \ + } while (FALSE) + +#define PA_REFCNT_INC(p) \ + do { \ + pa_atomic_inc(&(p)->_ref); \ + pa_log("REF: Inc %p", p); \ + } while (FALSE) \ + +#define PA_REFCNT_DEC(p) \ + ({ \ + int _j = (pa_atomic_dec(&(p)->_ref)-1); \ + if (_j <= 0) \ + pa_log("REF: Done %p", p); \ + else \ + pa_log("REF: Dec %p", p); \ + _j; \ + }) + +#endif #endif |