Address unload order issues for res_stasis* modules

I've noticed when doing a graceful shutdown that the res_stasis_http.so
module gets unloaded before the modules that use it, which causes some
asserts during their unload.

While r386928 was a quick hack to get it to not assert and die, this
patch increases the use counts on res_stasis.so and res_stasis_http.so
properly. It's a bigger change than I expected, hence the review instead
of just committing it.

Review: https://reviewboard.asterisk.org/r/2489/


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@388350 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
David M. Lee
2013-05-10 17:12:57 +00:00
parent db925c3f06
commit 4666079b05
16 changed files with 92 additions and 19 deletions

View File

@@ -942,6 +942,16 @@ static void sub_varset_handler(void *data,
generic_blob_handler(obj, handle_blob_varset);
}
void stasis_app_ref(void)
{
ast_module_ref(ast_module_info->self);
}
void stasis_app_unref(void)
{
ast_module_unref(ast_module_info->self);
}
static int load_module(void)
{
int r = 0;

View File

@@ -72,7 +72,6 @@
*/
/*** MODULEINFO
<depend type="module">app_stasis</depend>
<support_level>core</support_level>
***/
@@ -235,6 +234,7 @@ int stasis_http_add_handler(struct stasis_rest_handlers *handler)
ao2_cleanup(root_handler);
ao2_ref(new_handler, +1);
root_handler = new_handler;
ast_module_ref(ast_module_info->self);
return 0;
}
@@ -243,9 +243,7 @@ int stasis_http_remove_handler(struct stasis_rest_handlers *handler)
RAII_VAR(struct stasis_rest_handlers *, new_handler, NULL, ao2_cleanup);
size_t size, i, j;
if (!root_handler) {
return -1;
}
ast_assert(root_handler != NULL);
ast_mutex_lock(&root_handler_lock);
size = sizeof(*new_handler) +
@@ -259,6 +257,7 @@ int stasis_http_remove_handler(struct stasis_rest_handlers *handler)
for (i = 0, j = 0; i < root_handler->num_children; ++i) {
if (root_handler->children[i] == handler) {
ast_module_unref(ast_module_info->self);
continue;
}
new_handler->children[j++] = root_handler->children[i];
@@ -860,6 +859,7 @@ static struct ast_http_uri http_uri = {
static int load_module(void)
{
ast_mutex_init(&root_handler_lock);
root_handler = root_handler_create();
if (!root_handler) {
return AST_MODULE_LOAD_FAILURE;
@@ -932,6 +932,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY,
.load = load_module,
.unload = unload_module,
.reload = reload_module,
.nonoptreq = "app_stasis",
.load_pri = AST_MODPRI_APP_DEPEND,
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_asterisk.h"
/*!
@@ -86,12 +88,14 @@ static struct stasis_rest_handlers asterisk = {
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&asterisk);
}
static int unload_module(void)
{
stasis_http_remove_handler(&asterisk);
stasis_app_unref();
return 0;
}
@@ -99,5 +103,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - Asterisk resources",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_bridges.h"
/*!
@@ -274,12 +276,14 @@ static struct stasis_rest_handlers bridges = {
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&bridges);
}
static int unload_module(void)
{
stasis_http_remove_handler(&bridges);
stasis_app_unref();
return 0;
}
@@ -287,5 +291,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - Bridge resources",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_channels.h"
/*!
@@ -487,12 +489,14 @@ static struct stasis_rest_handlers channels = {
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&channels);
}
static int unload_module(void)
{
stasis_http_remove_handler(&channels);
stasis_app_unref();
return 0;
}
@@ -500,5 +504,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - Channel resources",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_endpoints.h"
/*!
@@ -137,12 +139,14 @@ static struct stasis_rest_handlers endpoints = {
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&endpoints);
}
static int unload_module(void)
{
stasis_http_remove_handler(&endpoints);
stasis_app_unref();
return 0;
}
@@ -150,5 +154,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - Endpoint resources",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_events.h"
#include "asterisk/stasis_channels.h"
@@ -597,12 +599,14 @@ struct ast_json *stasis_json_event_stasis_end_create(
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&events);
}
static int unload_module(void)
{
stasis_http_remove_handler(&events);
stasis_app_unref();
return 0;
}
@@ -610,5 +614,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - WebSocket resource",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_playback.h"
/*!
@@ -147,12 +149,14 @@ static struct stasis_rest_handlers playback = {
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&playback);
}
static int unload_module(void)
{
stasis_http_remove_handler(&playback);
stasis_app_unref();
return 0;
}
@@ -160,5 +164,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - Playback control resources",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_recordings.h"
/*!
@@ -381,12 +383,14 @@ static struct stasis_rest_handlers recordings = {
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&recordings);
}
static int unload_module(void)
{
stasis_http_remove_handler(&recordings);
stasis_app_unref();
return 0;
}
@@ -394,5 +398,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - Recording resources",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -33,6 +33,7 @@
/*** MODULEINFO
<depend type="module">res_stasis_http</depend>
<depend type="module">res_stasis</depend>
<support_level>core</support_level>
***/
@@ -41,6 +42,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
#include "asterisk/stasis_app.h"
#include "stasis_http/resource_sounds.h"
/*!
@@ -113,12 +115,14 @@ static struct stasis_rest_handlers sounds = {
static int load_module(void)
{
stasis_app_ref();
return stasis_http_add_handler(&sounds);
}
static int unload_module(void)
{
stasis_http_remove_handler(&sounds);
stasis_app_unref();
return 0;
}
@@ -126,5 +130,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"RESTful API module - Sound resources",
.load = load_module,
.unload = unload_module,
.nonoptreq = "res_stasis_http",
.nonoptreq = "res_stasis_http,res_stasis",
);

View File

@@ -263,6 +263,7 @@ static int load_module(void)
{
int r = 0;
stasis_app_ref();
oom_json = ast_json_pack("{s: s}",
"error", "OutOfMemory");
if (!oom_json) {
@@ -277,6 +278,7 @@ static int unload_module(void)
{
int r = 0;
stasis_app_unref();
ast_json_unref(oom_json);
oom_json = NULL;
r |= ast_websocket_remove_protocol(ws_protocol, websocket_callback);