From: Mark Michelson Date: Thu, 14 Apr 2016 18:49:35 +0000 (-0500) Subject: transport management: Register thread with PJProject. X-Git-Tag: certified/13.1-cert5~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b66c7367ec7f45fe35203fc716723bed694851b7;p=thirdparty%2Fasterisk.git transport management: Register thread with PJProject. The scheduler thread that kills idle TCP connections was not registering with PJProject properly and causing assertions if PJProject was built in debug mode. This change registers the thread with PJProject the first time that the scheduler callback executes. AST-2016-005 Change-Id: I5f7a37e2c80726a99afe9dc2a4a69bdedf661283 --- diff --git a/res/res_pjsip_transport_management.c b/res/res_pjsip_transport_management.c index ddde69de63..6a3c4049b3 100644 --- a/res/res_pjsip_transport_management.c +++ b/res/res_pjsip_transport_management.c @@ -101,11 +101,29 @@ static void *keepalive_transport_thread(void *data) return NULL; } +AST_THREADSTORAGE(desc_storage); + static int idle_sched_cb(const void *data) { struct monitored_transport *keepalive = (struct monitored_transport *) data; int sip_received = ast_atomic_fetchadd_int(&keepalive->sip_received, 0); + if (!pj_thread_is_registered()) { + pj_thread_t *thread; + pj_thread_desc *desc; + + 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(keepalive, -1); + return 0; + } + + pj_bzero(*desc, sizeof(*desc)); + + pj_thread_register("Transport Monitor", *desc, &thread); + } + if (!sip_received) { ast_log(LOG_NOTICE, "Shutting down transport '%s' since no request was received in %d seconds\n", keepalive->transport->info, IDLE_TIMEOUT);