aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r--channels/chan_iax2.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index d21cf8827..5cc34ee77 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -7874,14 +7874,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)))
iaxdynamicthreadcount--;
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