summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2015-10-02 16:27:57 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-10-02 16:27:57 -0500
commit40bc805b0da671e16690af5b1857454b0af0baab (patch)
tree30e43e23ac9b1404b7de58d986690d0260c813bc
parent8804ad62ecb62f0814943993c5bd63575665f9db (diff)
parent6554a3b25e7dbfd50d34bda244aa08ce37187707 (diff)
Merge "res_sorcery_memory_cache.c: Shutdown in a less crash potential order."
-rw-r--r--res/res_sorcery_memory_cache.c53
1 files changed, 29 insertions, 24 deletions
diff --git a/res/res_sorcery_memory_cache.c b/res/res_sorcery_memory_cache.c
index 0a33ae401..53fa3b963 100644
--- a/res/res_sorcery_memory_cache.c
+++ b/res/res_sorcery_memory_cache.c
@@ -2482,22 +2482,6 @@ cleanup:
static int unload_module(void)
{
- if (sched) {
- ast_sched_context_destroy(sched);
- sched = NULL;
- }
-
- ao2_cleanup(caches);
-
- ast_sorcery_wizard_unregister(&memory_cache_object_wizard);
-
- ast_cli_unregister_multiple(cli_memory_cache, ARRAY_LEN(cli_memory_cache));
-
- ast_manager_unregister("SorceryMemoryCacheExpireObject");
- ast_manager_unregister("SorceryMemoryCacheExpire");
- ast_manager_unregister("SorceryMemoryCacheStaleObject");
- ast_manager_unregister("SorceryMemoryCacheStale");
-
AST_TEST_UNREGISTER(open_with_valid_options);
AST_TEST_UNREGISTER(open_with_invalid_options);
AST_TEST_UNREGISTER(create_and_retrieve);
@@ -2507,6 +2491,27 @@ static int unload_module(void)
AST_TEST_UNREGISTER(expiration);
AST_TEST_UNREGISTER(stale);
+ ast_manager_unregister("SorceryMemoryCacheExpireObject");
+ ast_manager_unregister("SorceryMemoryCacheExpire");
+ ast_manager_unregister("SorceryMemoryCacheStaleObject");
+ ast_manager_unregister("SorceryMemoryCacheStale");
+
+ ast_cli_unregister_multiple(cli_memory_cache, ARRAY_LEN(cli_memory_cache));
+
+ ast_sorcery_wizard_unregister(&memory_cache_object_wizard);
+
+ /*
+ * XXX There is the potential to leak memory if there are pending
+ * next-cache-expiration and stale-cache-update tasks in the scheduler.
+ */
+ if (sched) {
+ ast_sched_context_destroy(sched);
+ sched = NULL;
+ }
+
+ ao2_cleanup(caches);
+ caches = NULL;
+
return 0;
}
@@ -2514,6 +2519,14 @@ static int load_module(void)
{
int res;
+ caches = ao2_container_alloc(CACHES_CONTAINER_BUCKET_SIZE, sorcery_memory_cache_hash,
+ sorcery_memory_cache_cmp);
+ if (!caches) {
+ ast_log(LOG_ERROR, "Failed to create container for configured caches\n");
+ unload_module();
+ return AST_MODULE_LOAD_DECLINE;
+ }
+
sched = ast_sched_context_create();
if (!sched) {
ast_log(LOG_ERROR, "Failed to create scheduler for cache management\n");
@@ -2527,14 +2540,6 @@ static int load_module(void)
return AST_MODULE_LOAD_DECLINE;
}
- caches = ao2_container_alloc(CACHES_CONTAINER_BUCKET_SIZE, sorcery_memory_cache_hash,
- sorcery_memory_cache_cmp);
- if (!caches) {
- ast_log(LOG_ERROR, "Failed to create container for configured caches\n");
- unload_module();
- return AST_MODULE_LOAD_DECLINE;
- }
-
if (ast_sorcery_wizard_register(&memory_cache_object_wizard)) {
unload_module();
return AST_MODULE_LOAD_DECLINE;