]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Resolve transport management leak at shutdown.
authorCorey Farrell <git@cfware.com>
Wed, 15 Aug 2018 18:51:36 +0000 (14:51 -0400)
committerCorey Farrell <git@cfware.com>
Wed, 15 Aug 2018 18:55:48 +0000 (13:55 -0500)
Cleanup idle check scheduled events at shutdown.

Change-Id: I61bfbb56bac69fe840c3242927d31ff3593be461

res/res_pjsip/pjsip_transport_management.c

index d9866f16447fe001eb2fd793cad0bea726c801a1..e7483e6d61f6de8fbed86cb798a0ef5e705a22c5 100644 (file)
@@ -119,10 +119,8 @@ static void *keepalive_transport_thread(void *data)
 
 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()) {
                pj_thread_t *thread;
                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));
                if (!desc) {
                        ast_log(LOG_ERROR, "Could not get thread desc from thread-local storage.\n");
-                       ao2_ref(monitored, -1);
-                       return 0;
+                       return -1;
                }
 
                pj_bzero(*desc, sizeof(*desc));
@@ -139,6 +136,18 @@ static int idle_sched_cb(const void *data)
                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) {
                ast_log(LOG_NOTICE, "Shutting down transport '%s' since no request was received in %d seconds\n",
                        monitored->transport->info, IDLE_TIMEOUT / 1000);
@@ -149,6 +158,18 @@ static int idle_sched_cb(const void *data)
        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 */
 static void monitored_transport_destroy(void *obj)
 {
@@ -384,6 +405,7 @@ void ast_sip_destroy_transport_management(void)
 
        internal_sip_unregister_service(&idle_monitor_module);
 
+       ast_sched_clean_by_callback(sched, idle_sched_cb, idle_sched_cleanup);
        ast_sched_context_destroy(sched);
        sched = NULL;