From: Corey Farrell Date: Sat, 21 Feb 2015 02:58:19 +0000 (+0000) Subject: Allow shutdown to unload modules that register bucket scheme's or codec's. X-Git-Tag: 14.0.0-beta1~1231 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e66b874f5db1a5cfe3ede6e0cb72f1a545744d75;p=thirdparty%2Fasterisk.git Allow shutdown to unload modules that register bucket scheme's or codec's. * Change __ast_module_shutdown_ref to be NULL safe (11+). * Allow modules that call ast_bucket_scheme_register or ast_codec_register to be unloaded during graceful shutdown only (13+ only). ASTERISK-24796 #close Reported by: Corey Farrell Review: https://reviewboard.asterisk.org/r/4428/ ........ Merged revisions 432058 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 432059 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@432060 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/bucket.c b/main/bucket.c index 78a2289fd0..90397f1f9b 100644 --- a/main/bucket.c +++ b/main/bucket.c @@ -282,7 +282,7 @@ int __ast_bucket_scheme_register(const char *name, struct ast_sorcery_wizard *bu ast_verb(2, "Registered bucket scheme '%s'\n", name); - ast_module_ref(module); + ast_module_shutdown_ref(module); return 0; } diff --git a/main/codec.c b/main/codec.c index 19e78fa675..45f2edf2ba 100644 --- a/main/codec.c +++ b/main/codec.c @@ -296,8 +296,8 @@ int __ast_codec_register(struct ast_codec *codec, struct ast_module *mod) ao2_link_flags(codecs, codec_new, OBJ_NOLOCK); - /* Once registered a codec can not be unregistered, and the module must persist */ - ast_module_ref(mod); + /* Once registered a codec can not be unregistered, and the module must persist until shutdown */ + ast_module_shutdown_ref(mod); ast_verb(2, "Registered '%s' codec '%s' at sample rate '%u' with id '%u'\n", ast_codec_media_type2str(codec->type), codec->name, codec->sample_rate, codec_new->id); diff --git a/main/loader.c b/main/loader.c index 5d644ed6bc..b14914acba 100644 --- a/main/loader.c +++ b/main/loader.c @@ -1484,10 +1484,12 @@ struct ast_module *__ast_module_ref(struct ast_module *mod, const char *file, in void __ast_module_shutdown_ref(struct ast_module *mod, const char *file, int line, const char *func) { - if (!mod->flags.keepuntilshutdown) { - __ast_module_ref(mod, file, line, func); - mod->flags.keepuntilshutdown = 1; + if (!mod || mod->flags.keepuntilshutdown) { + return; } + + __ast_module_ref(mod, file, line, func); + mod->flags.keepuntilshutdown = 1; } void __ast_module_unref(struct ast_module *mod, const char *file, int line, const char *func)