From 5bedd4a9b45bb2d7ded09ad6d0b3561e2d091711 Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Sun, 22 Sep 2019 22:04:44 -0400 Subject: [PATCH] core: Fix ABI mismatch of ao2_global_obj. astobj2.c declares DEBUG_THREADS_LOOSE_ABI to avoid overhead of debug threads tracking information in the internal structures of astobj2. Unfortunately this means that ao2_global_obj contains the statically allocated debug threads tracking fields which are used by initialization and cleanup but main/astobj2.c believed those fields and associated space did not exist. Change-Id: Icef41ad97d88a8c1d1515e034ec8133cab3b1527 --- main/astobj2.c | 66 ----------------------------- main/astobj2_global.c | 97 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 66 deletions(-) create mode 100644 main/astobj2_global.c diff --git a/main/astobj2.c b/main/astobj2.c index ebc07200dd..25fc37c085 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 0000000000..9d6d7f3ef5 --- /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 + */ + +/*** 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; +}