diff --git a/main/astobj2.c b/main/astobj2.c index fb5bd0e6fa3452652b51da79fbde4e41938973a2..ab8fb8bdf8ff77a6bdc00db2f941a43ecb62681b 100644 --- a/main/astobj2.c +++ b/main/astobj2.c @@ -786,72 +786,6 @@ unsigned int ao2_options_get(void *obj) return orig_obj->priv_data.options; } -void *__ao2_global_obj_replace(struct ao2_global_obj *holder, void *obj, const char *tag, const char *file, int line, const char *func, const char *name) -{ - void *obj_old; - - if (!holder) { - /* For sanity */ - ast_log(LOG_ERROR, "Must be called with a global object!\n"); - ast_assert(0); - return NULL; - } - if (__ast_rwlock_wrlock(file, line, func, &holder->lock, name)) { - /* Could not get the write lock. */ - ast_assert(0); - return NULL; - } - - if (obj) { - __ao2_ref(obj, +1, tag, file, line, func); - } - obj_old = holder->obj; - holder->obj = obj; - - __ast_rwlock_unlock(file, line, func, &holder->lock, name); - - return obj_old; -} - -int __ao2_global_obj_replace_unref(struct ao2_global_obj *holder, void *obj, const char *tag, const char *file, int line, const char *func, const char *name) -{ - void *obj_old; - - obj_old = __ao2_global_obj_replace(holder, obj, tag, file, line, func, name); - if (obj_old) { - __ao2_ref(obj_old, -1, tag, file, line, func); - return 1; - } - return 0; -} - -void *__ao2_global_obj_ref(struct ao2_global_obj *holder, const char *tag, const char *file, int line, const char *func, const char *name) -{ - void *obj; - - if (!holder) { - /* For sanity */ - ast_log(LOG_ERROR, "Must be called with a global object!\n"); - ast_assert(0); - return NULL; - } - - if (__ast_rwlock_rdlock(file, line, func, &holder->lock, name)) { - /* Could not get the read lock. */ - ast_assert(0); - return NULL; - } - - obj = holder->obj; - if (obj) { - __ao2_ref(obj, +1, tag, file, line, func); - } - - __ast_rwlock_unlock(file, line, func, &holder->lock, name); - - return obj; -} - void *__ao2_weakproxy_alloc(size_t data_size, ao2_destructor_fn destructor_fn, const char *tag, const char *file, int line, const char *func) diff --git a/main/astobj2_global.c b/main/astobj2_global.c new file mode 100644 index 0000000000000000000000000000000000000000..9d6d7f3ef55a6cccc26fcad97f7c1f87c1596e91 --- /dev/null +++ b/main/astobj2_global.c @@ -0,0 +1,97 @@ +/* + * astobj2_global - global containers for AO2 objects. + * + * Copyright (C) 2006 Marta Carbone, Luigi Rizzo - Univ. di Pisa, Italy + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +/*! \file + * + * \brief Functions implementing ao2_global_obj routines. + * + * \author Richard Mudgett <rmudgett@digium.com> + */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ + +#include "asterisk.h" + +#include "asterisk/astobj2.h" +#include "asterisk/utils.h" + +void *__ao2_global_obj_replace(struct ao2_global_obj *holder, void *obj, const char *tag, const char *file, int line, const char *func, const char *name) +{ + void *obj_old; + + if (!holder) { + /* For sanity */ + ast_log(LOG_ERROR, "Must be called with a global object!\n"); + ast_assert(0); + return NULL; + } + if (__ast_rwlock_wrlock(file, line, func, &holder->lock, name)) { + /* Could not get the write lock. */ + ast_assert(0); + return NULL; + } + + if (obj) { + __ao2_ref(obj, +1, tag, file, line, func); + } + obj_old = holder->obj; + holder->obj = obj; + + __ast_rwlock_unlock(file, line, func, &holder->lock, name); + + return obj_old; +} + +int __ao2_global_obj_replace_unref(struct ao2_global_obj *holder, void *obj, const char *tag, const char *file, int line, const char *func, const char *name) +{ + void *obj_old; + + obj_old = __ao2_global_obj_replace(holder, obj, tag, file, line, func, name); + if (obj_old) { + __ao2_ref(obj_old, -1, tag, file, line, func); + return 1; + } + return 0; +} + +void *__ao2_global_obj_ref(struct ao2_global_obj *holder, const char *tag, const char *file, int line, const char *func, const char *name) +{ + void *obj; + + if (!holder) { + /* For sanity */ + ast_log(LOG_ERROR, "Must be called with a global object!\n"); + ast_assert(0); + return NULL; + } + + if (__ast_rwlock_rdlock(file, line, func, &holder->lock, name)) { + /* Could not get the read lock. */ + ast_assert(0); + return NULL; + } + + obj = holder->obj; + if (obj) { + __ao2_ref(obj, +1, tag, file, line, func); + } + + __ast_rwlock_unlock(file, line, func, &holder->lock, name); + + return obj; +}