diff options
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r-- | channels/chan_iax2.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index c035b151a..72bf28f73 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -8392,14 +8392,23 @@ static void *iax2_process_thread(void *data) ts.tv_sec = tv.tv_sec; ts.tv_nsec = tv.tv_usec * 1000; if (ast_cond_timedwait(&thread->cond, &thread->lock, &ts) == ETIMEDOUT) { + /* This thread was never put back into the available dynamic + * thread list, so just go away. */ + if (!put_into_idle) { + ast_mutex_unlock(&thread->lock); + break; + } AST_LIST_LOCK(&dynamic_list); /* Account for the case where this thread is acquired *right* after a timeout */ if ((t = AST_LIST_REMOVE(&dynamic_list, thread, list))) ast_atomic_fetchadd_int(&iaxdynamicthreadcount, -1); AST_LIST_UNLOCK(&dynamic_list); if (t) { + /* This dynamic thread timed out waiting for a task and was + * not acquired immediately after the timeout, + * so it's time to go away. */ ast_mutex_unlock(&thread->lock); - break; /* exiting the main loop */ + break; } /* Someone grabbed our thread *right* after we timed out. * Wait for them to set us up with something to do and signal |