]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/refcnt.h
win32: Implement pa_random
[pulseaudio] / src / pulsecore / refcnt.h
index f0885fb4884cf2f6ad473b5e333fc92a57979778..782436b5cd28c03ebeabe65fa9a4d65a285935b8 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef foopulserefcnthfoo
 #define foopulserefcnthfoo
 
 #ifndef foopulserefcnthfoo
 #define foopulserefcnthfoo
 
-/* $Id$ */
-
 /***
   This file is part of PulseAudio.
 
 /***
   This file is part of PulseAudio.
 
@@ -10,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