summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Joseph <george.joseph@fairview5.com>2015-04-09 22:31:58 +0000
committerGeorge Joseph <george.joseph@fairview5.com>2015-04-09 22:31:58 +0000
commit73c286a393e359598073293d31eb9c4f07704af0 (patch)
tree81707977e0040d1fe9ad682375b762c117fe8704
parent5737650a672ff2b1e2fdd8b76de345d12ede81c8 (diff)
loader/main: Don't set ast_fully_booted until deferred reloads are processed
Until we have a true module management facility it's sometimes necessary for one module to force a reload on another before its own load is complete. If Asterisk isn't fully booted yet, these reloads are deferred. The problem is that asterisk reports fully booted before processing the deferred reloads which means Asterisk really isn't quite ready when it says it is. This patch moves the report of fully booted after the processing of the deferred reloads is complete. Since the pjsip stack has the most number of related modules, I ran the channels/pjsip testsuite to make sure there aren't any issues. All tests passed. Tested-by: George Joseph Review: https://reviewboard.asterisk.org/r/4604/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@434544 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--main/asterisk.c4
-rw-r--r--main/loader.c11
2 files changed, 9 insertions, 6 deletions
diff --git a/main/asterisk.c b/main/asterisk.c
index 082935d22..aa9d1f6b7 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -4671,11 +4671,11 @@ int main(int argc, char *argv[])
sig_alert_pipe[0] = sig_alert_pipe[1] = -1;
}
+ ast_process_pending_reloads();
+
ast_set_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED);
publish_fully_booted();
- ast_process_pending_reloads();
-
pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
#if defined(__AST_DEBUG_MALLOC)
diff --git a/main/loader.c b/main/loader.c
index 3a596bcf4..814bb9768 100644
--- a/main/loader.c
+++ b/main/loader.c
@@ -115,6 +115,11 @@ static unsigned int embedding = 1; /* we always start out by registering embedde
since they are here before we dlopen() any
*/
+/*!
+ * \brief Internal flag to indicate all modules have been initially loaded.
+ */
+static int modules_loaded;
+
struct ast_module {
const struct ast_module_info *info;
#ifdef REF_DEBUG
@@ -767,9 +772,7 @@ void ast_process_pending_reloads(void)
{
struct reload_queue_item *item;
- if (!ast_fully_booted) {
- return;
- }
+ modules_loaded = 1;
AST_LIST_LOCK(&reload_queue);
@@ -879,7 +882,7 @@ enum ast_module_reload_result ast_module_reload(const char *name)
/* If we aren't fully booted, we just pretend we reloaded but we queue this
up to run once we are booted up. */
- if (!ast_fully_booted) {
+ if (!modules_loaded) {
queue_reload_request(name);
res = AST_MODULE_RELOAD_QUEUED;
goto module_reload_exit;