X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/9948cb09a3e1b976ad1705df06ef24216a61bf85..5205e6a85ac8699c464e2d676c4d8b1c2b7989e5:/src/pulsecore/refcnt.h diff --git a/src/pulsecore/refcnt.h b/src/pulsecore/refcnt.h index fade9aa4..782436b5 100644 --- a/src/pulsecore/refcnt.h +++ b/src/pulsecore/refcnt.h @@ -1,41 +1,81 @@ -#ifndef foopulserefcntfoo -#define foopulserefcntfoo - -/* $Id$ */ +#ifndef foopulserefcnthfoo +#define foopulserefcnthfoo /*** This file is part of PulseAudio. - + + Copyright 2006 Lennart Poettering + 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 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with PulseAudio; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ***/ -#include +#include +#include +#include + +/* #define DEBUG_REF */ + +#define PA_REFCNT_DECLARE \ + pa_atomic_t _ref + +#define PA_REFCNT_VALUE(p) \ + pa_atomic_load(&(p)->_ref) -#define PA_REFCNT_DECLARE volatile AO_t _ref +#define PA_REFCNT_INIT_ZERO(p) \ + pa_atomic_store(&(p)->_ref, 0) + +#ifndef DEBUG_REF #define PA_REFCNT_INIT(p) \ - AO_store_release_write(&(p)->_ref, 1) + pa_atomic_store(&(p)->_ref, 1) #define PA_REFCNT_INC(p) \ - AO_fetch_and_add1_release_write(&(p)->_ref) + pa_atomic_inc(&(p)->_ref) #define PA_REFCNT_DEC(p) \ - (AO_fetch_and_sub1_release_write(&(p)->_ref)-1) + (pa_atomic_dec(&(p)->_ref)-1) -#define PA_REFCNT_VALUE(p) \ - AO_load_acquire_read(&(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