X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Flttng%2Fref-internal.h;fp=include%2Flttng%2Fref-internal.h;h=4ecb2e25ae8aba93c02d3ec59e34d76682ed69ac;hb=8abe313a6c4f251063e4b72ddd47ce8107384d71;hp=0000000000000000000000000000000000000000;hpb=259c267446a63c501298f39a5d2397314b11f729;p=lttng-tools.git diff --git a/include/lttng/ref-internal.h b/include/lttng/ref-internal.h new file mode 100644 index 000000000..4ecb2e25a --- /dev/null +++ b/include/lttng/ref-internal.h @@ -0,0 +1,62 @@ +#ifndef LTTNG_REF_INTERNAL_H +#define LTTNG_REF_INTERNAL_H + +/* + * LTTng - Non thread-safe reference counting + * + * Copyright 2013, 2014 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License, version 2.1 only, + * as published by the Free Software Foundation. + * + * This library 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 this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +typedef void (*lttng_release_func)(void *); + +struct lttng_ref { + unsigned long count; + lttng_release_func release; +}; + +static inline +void lttng_ref_init(struct lttng_ref *ref, lttng_release_func release) +{ + assert(ref); + ref->count = 1; + ref->release = release; +} + +static inline +void lttng_ref_get(struct lttng_ref *ref) +{ + assert(ref); + ref->count++; + /* Overflow check. */ + assert(ref->count); +} + +static inline +void lttng_ref_put(struct lttng_ref *ref) +{ + assert(ref); + /* Underflow check. */ + assert(ref->count); + if (caa_unlikely((--ref->count) == 0)) { + ref->release(ref); + } +} + +#endif /* LTTNG_REF_INTERNAL_H */