summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2016-04-14 13:49:35 -0500
committerMark Michelson <mmichelson@digium.com>2016-04-14 14:25:13 -0500
commit5f788018592ec33e4b8928a614ca012fcc75542e (patch)
tree536c2f228cf3cea4b0f694a055f61dac7f0d1f8f /res
parent13cb5ea73fad7cc0ae9140ad8070d362f3aa6527 (diff)
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
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_transport_management.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/res/res_pjsip_transport_management.c b/res/res_pjsip_transport_management.c
index fffd1a9fb..eb0240438 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);