From 3664249356aa4768fcb0b3b8e6cf9365fcbd0c8d Mon Sep 17 00:00:00 2001 From: rizzo Date: Fri, 14 Apr 2006 14:08:19 +0000 Subject: This rather large commit changes the way modules are loaded. As partly documented in loader.c and include/asterisk/module.h, modules are now expected to return all of their methods and flags into a structure 'mod_data', and are normally loaded with RTLD_NOW | RTLD_LOCAL, so symbols are resolved immediately and conflicts should be less likely. Only in a small number of cases (res_*, typically) modules are loaded RTLD_GLOBAL, so they can export symbols. The core of the change is only the two files loader.c and include/asterisk/module.h, all the rest is simply adaptation of the existing modules to the new API, a rather mechanical (but believe me, time and finger-consuming!) process whose detail you can figure out by svn diff'ing any single module. Expect some minor compilation issue after this change, please report it on mantis http://bugs.digium.com/view.php?id=6968 so we collect all the feedback in one place. I am just sorry that this change missed SVN version number 20000! git-svn-id: http://svn.digium.com/svn/asterisk/trunk@20003 f38db490-d61c-443f-a65b-d21fe96a405b --- translate.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'translate.c') diff --git a/translate.c b/translate.c index 92a3a9753..20da09113 100644 --- a/translate.c +++ b/translate.c @@ -31,6 +31,7 @@ #include #include +#define MOD_LOADER /* not really a module */ #include "asterisk.h" ASTERISK_FILE_VERSION(__FILE__, "$Revision$") @@ -39,6 +40,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/channel.h" #include "asterisk/logger.h" #include "asterisk/translate.h" +#include "asterisk/module.h" #include "asterisk/options.h" #include "asterisk/frame.h" #include "asterisk/sched.h" @@ -94,6 +96,8 @@ static void *newpvt(struct ast_translator *t) int len; int useplc = t->plc_samples > 0 && t->useplc; /* cache, because it can change on the fly */ char *ofs; + struct module_symbols *ms = t->module; + /* * compute the required size adding private descriptor, * plc, buffer, AST_FRIENDLY_OFFSET. @@ -123,9 +127,7 @@ static void *newpvt(struct ast_translator *t) free(pvt); return NULL; } - ast_mutex_lock(&t->lockp->lock); - t->lockp->usecnt++; - ast_mutex_unlock(&t->lockp->lock); + ast_atomic_fetchadd_int(&ms->usecnt, +1); ast_update_use_count(); return pvt; } @@ -133,13 +135,12 @@ static void *newpvt(struct ast_translator *t) static void destroy(struct ast_trans_pvt *pvt) { struct ast_translator *t = pvt->t; + struct module_symbols *ms = t->module; if (t->destroy) t->destroy(pvt); free(pvt); - ast_mutex_lock(&t->lockp->lock); - t->lockp->usecnt--; - ast_mutex_unlock(&t->lockp->lock); + ast_atomic_fetchadd_int(&ms->usecnt, -1); ast_update_use_count(); } @@ -519,14 +520,15 @@ static char show_trans_usage[] = static struct ast_cli_entry show_trans = { { "show", "translation", NULL }, show_translation, "Display translation matrix", show_trans_usage }; -int ast_register_translator(struct ast_translator *t) +int ast_register_translator(struct ast_translator *t, void *module) { static int added_cli = 0; - if (t->lockp == NULL) { - ast_log(LOG_WARNING, "Missing lock pointer, you need to supply one\n"); + if (module == NULL) { + ast_log(LOG_WARNING, "Missing module pointer, you need to supply one\n"); return -1; } + t->module = module; if (t->buf_size == 0) { ast_log(LOG_WARNING, "empty buf size, you need to supply one\n"); return -1; @@ -561,10 +563,6 @@ int ast_register_translator(struct ast_translator *t) int align = (char *)&p.b - (char *)&p.a; t->buf_size = ((t->buf_size + align - 1)/align)*align; } - if (t->lockp->usecnt < 0) { /* XXX need to initialize the lock */ - ast_mutex_init(&t->lockp->lock); - t->lockp->usecnt = 0; - } if (t->frameout == NULL) t->frameout = default_frameout; -- cgit v1.2.3