mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-07 13:49:18 +00:00
Merge "res_pjsip: Resolve transport management leak at shutdown." into 16
This commit is contained in:
@@ -119,10 +119,8 @@ static void *keepalive_transport_thread(void *data)
|
|||||||
|
|
||||||
AST_THREADSTORAGE(desc_storage);
|
AST_THREADSTORAGE(desc_storage);
|
||||||
|
|
||||||
static int idle_sched_cb(const void *data)
|
static int idle_sched_init_pj_thread(void)
|
||||||
{
|
{
|
||||||
struct monitored_transport *monitored = (struct monitored_transport *) data;
|
|
||||||
|
|
||||||
if (!pj_thread_is_registered()) {
|
if (!pj_thread_is_registered()) {
|
||||||
pj_thread_t *thread;
|
pj_thread_t *thread;
|
||||||
pj_thread_desc *desc;
|
pj_thread_desc *desc;
|
||||||
@@ -130,8 +128,7 @@ static int idle_sched_cb(const void *data)
|
|||||||
desc = ast_threadstorage_get(&desc_storage, sizeof(pj_thread_desc));
|
desc = ast_threadstorage_get(&desc_storage, sizeof(pj_thread_desc));
|
||||||
if (!desc) {
|
if (!desc) {
|
||||||
ast_log(LOG_ERROR, "Could not get thread desc from thread-local storage.\n");
|
ast_log(LOG_ERROR, "Could not get thread desc from thread-local storage.\n");
|
||||||
ao2_ref(monitored, -1);
|
return -1;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pj_bzero(*desc, sizeof(*desc));
|
pj_bzero(*desc, sizeof(*desc));
|
||||||
@@ -139,6 +136,18 @@ static int idle_sched_cb(const void *data)
|
|||||||
pj_thread_register("Transport Monitor", *desc, &thread);
|
pj_thread_register("Transport Monitor", *desc, &thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int idle_sched_cb(const void *data)
|
||||||
|
{
|
||||||
|
struct monitored_transport *monitored = (struct monitored_transport *) data;
|
||||||
|
|
||||||
|
if (idle_sched_init_pj_thread()) {
|
||||||
|
ao2_ref(monitored, -1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!monitored->sip_received) {
|
if (!monitored->sip_received) {
|
||||||
ast_log(LOG_NOTICE, "Shutting down transport '%s' since no request was received in %d seconds\n",
|
ast_log(LOG_NOTICE, "Shutting down transport '%s' since no request was received in %d seconds\n",
|
||||||
monitored->transport->info, IDLE_TIMEOUT / 1000);
|
monitored->transport->info, IDLE_TIMEOUT / 1000);
|
||||||
@@ -149,6 +158,18 @@ static int idle_sched_cb(const void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int idle_sched_cleanup(const void *data)
|
||||||
|
{
|
||||||
|
struct monitored_transport *monitored = (struct monitored_transport *) data;
|
||||||
|
|
||||||
|
if (!idle_sched_init_pj_thread()) {
|
||||||
|
pjsip_transport_shutdown(monitored->transport);
|
||||||
|
}
|
||||||
|
ao2_ref(monitored, -1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*! \brief Destructor for keepalive transport */
|
/*! \brief Destructor for keepalive transport */
|
||||||
static void monitored_transport_destroy(void *obj)
|
static void monitored_transport_destroy(void *obj)
|
||||||
{
|
{
|
||||||
@@ -384,6 +405,7 @@ void ast_sip_destroy_transport_management(void)
|
|||||||
|
|
||||||
ast_sip_unregister_service(&idle_monitor_module);
|
ast_sip_unregister_service(&idle_monitor_module);
|
||||||
|
|
||||||
|
ast_sched_clean_by_callback(sched, idle_sched_cb, idle_sched_cleanup);
|
||||||
ast_sched_context_destroy(sched);
|
ast_sched_context_destroy(sched);
|
||||||
sched = NULL;
|
sched = NULL;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user