]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/refcnt.h
Remove pa_bool_t and replace it with bool.
[pulseaudio] / src / pulsecore / refcnt.h
index 291f4504a8ca79075412ed8263de206f064d4ebc..d52cac831cb85656c0a3e3c0251c9f5ebfa95b85 100644 (file)
@@ -8,7 +8,7 @@
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as
-  published by the Free Software Foundation; either version 2 of the
+  published by the Free Software Foundation; either version 2.1 of the
   License, or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
   License, or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
 ***/
 
 #include <pulsecore/atomic.h>
 ***/
 
 #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_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)
 
 
 #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_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
 
 #endif