/* * This file is part of FFmpeg. * * FFmpeg 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.1 of the License, or (at your option) any later version. * * FFmpeg 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AVUTIL_REFCOUNT_H #define AVUTIL_REFCOUNT_H #include /** * A thread-safe reference counter. * * Unlike most libav* structs, sizeof(AVRefcount) IS a part of the public ABI * and so it can be embedded directly in other structs. * * None of its fields should be accessed directly by the caller, always use the * av_refcount_*() functions. */ typedef struct AVRefcount { void (*_internal0)(void *); void *_internal1; intmax_t _internal2; } AVRefcount; /** * Initialize an AVRefcount to a reference count of 1. This function MUST be * called on an AVRefcount before doing anything else with it. * * @param free The callback to be invoked when the counter reaches zero. May be * NULL, then nothing is called. * @param opaque arbitrary user data that will be passed to the free() callback. */ void av_refcount_init(AVRefcount *rc, void (*free)(void *opaque), void *opaque); /** * Increase the reference count by 1. */ void av_refcount_inc(AVRefcount *rc); /** * Decrease the reference count by 1. * * @return * - 0 when the new reference count is 0. If a free() callback was passed to * av_refcount_init(), it has been invoked. * - a positive value when the new reference count is non-zero * * @note the return value is the new reference count, which may be useful for * debugging, but this is not guaranteed by the API and the callers MUST NOT * rely on this */ unsigned int av_refcount_dec(AVRefcount *rc); /** * Check whether the caller is the exclusive owner of the reference. * @return * - a positive number if the reference count is exactly 1 * - zero otherwise */ int av_refcount_exclusive(AVRefcount *rc); #endif /* AVUTIL_REFCOUNT_H */