aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_iax2.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 2dbc74f47..d21cf8827 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -7874,14 +7874,20 @@ 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) {
- ast_mutex_unlock(&thread->lock);
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)
+ if (t) {
+ ast_mutex_unlock(&thread->lock);
break; /* exiting the main loop */
+ }
+ /* Someone grabbed our thread *right* after we timed out.
+ * Wait for them to set us up with something to do and signal
+ * us to continue. */
+ ast_cond_timedwait(&thread->cond, &thread->lock, &ts);
+ ast_mutex_unlock(&thread->lock);
}
if (!t)
ast_mutex_unlock(&thread->lock);