diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-14 14:08:19 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-14 14:08:19 +0000 |
commit | 3664249356aa4768fcb0b3b8e6cf9365fcbd0c8d (patch) | |
tree | b68f48482e463e9c31126b2e3e24fca1dd2f6c82 /file.c | |
parent | f9d382fc079246930a99640d7835d6ae3e4149db (diff) |
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
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 25 |
1 files changed, 6 insertions, 19 deletions
@@ -51,6 +51,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/app.h" #include "asterisk/pbx.h" #include "asterisk/linkedlists.h" +#define MOD_LOADER #include "asterisk/module.h" /* ast_update_use_count() */ /* @@ -69,8 +70,8 @@ int ast_format_register(const struct ast_format *f) { struct ast_format *tmp; - if (f->lockp == NULL) { - ast_log(LOG_WARNING, "Missing lock pointer, you need to supply one\n"); + if (f->module == NULL) { + ast_log(LOG_WARNING, "Missing module pointer, you need to supply one\n"); return -1; } if (AST_LIST_LOCK(&formats)) { @@ -101,10 +102,6 @@ int ast_format_register(const struct ast_format *f) } memset(&tmp->list, 0, sizeof(tmp->list)); - if (tmp->lockp->usecnt < 0) { - ast_mutex_init(&tmp->lockp->lock); - tmp->lockp->usecnt = 0; - } AST_LIST_INSERT_HEAD(&formats, tmp, list); AST_LIST_UNLOCK(&formats); @@ -319,12 +316,7 @@ static int fn_wrapper(struct ast_filestream *s, const char *comment, enum wrap_f ast_log(LOG_WARNING, "Unable to rewrite format %s\n", f->name); else { /* preliminary checks succeed. update usecount */ - if (ast_mutex_lock(&f->lockp->lock)) { - ast_log(LOG_WARNING, "Unable to lock format %s\n", f->name); - return -1; - } - f->lockp->usecnt++; - ast_mutex_unlock(&f->lockp->lock); + ast_atomic_fetchadd_int(&f->module->usecnt, +1); ret = 0; ast_update_use_count(); } @@ -749,13 +741,8 @@ int ast_closestream(struct ast_filestream *f) fclose(f->f); if (f->vfs) ast_closestream(f->vfs); - if (ast_mutex_lock(&f->fmt->lockp->lock)) { - ast_log(LOG_WARNING, "Unable to lock format %s\n", f->fmt->name); - } else { - f->fmt->lockp->usecnt--; - ast_mutex_unlock(&f->fmt->lockp->lock); - ast_update_use_count(); - } + ast_atomic_fetchadd_int(&f->fmt->module->usecnt, -1); + ast_update_use_count(); free(f); return 0; } |