/* * 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 */ /*** MODULEINFO core ***/ #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; }