summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_iax2.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 16f2765c3..23c11b922 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -871,6 +871,21 @@ static const struct ast_channel_tech iax2_tech = {
.fixup = iax2_fixup,
};
+static void insert_idle_thread(struct iax2_thread *thread)
+{
+ if (thread->type == IAX_THREAD_TYPE_DYNAMIC) {
+ AST_LIST_LOCK(&dynamic_list);
+ AST_LIST_INSERT_TAIL(&dynamic_list, thread, list);
+ AST_LIST_UNLOCK(&dynamic_list);
+ } else {
+ AST_LIST_LOCK(&idle_list);
+ AST_LIST_INSERT_TAIL(&idle_list, thread, list);
+ AST_LIST_UNLOCK(&idle_list);
+ }
+
+ return;
+}
+
static struct iax2_thread *find_idle_thread(void)
{
struct iax2_thread *thread = NULL;
@@ -6261,15 +6276,11 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
if (errno != ECONNREFUSED && errno != EAGAIN)
ast_log(LOG_WARNING, "Error: %s\n", strerror(errno));
handle_error();
- AST_LIST_LOCK(&idle_list);
- AST_LIST_INSERT_TAIL(&idle_list, thread, list);
- AST_LIST_UNLOCK(&idle_list);
+ insert_idle_thread(thread);
return 1;
}
if (test_losspct && ((100.0 * ast_random() / (RAND_MAX + 1.0)) < test_losspct)) { /* simulate random loss condition */
- AST_LIST_LOCK(&idle_list);
- AST_LIST_INSERT_TAIL(&idle_list, thread, list);
- AST_LIST_UNLOCK(&idle_list);
+ insert_idle_thread(thread);
return 1;
}
/* Mark as ready and send on its way */
@@ -7666,10 +7677,16 @@ static void *iax2_process_thread(void *data)
struct iax2_thread *thread = data;
struct timeval tv;
struct timespec ts;
+ int put_into_idle = 0;
for(;;) {
/* Wait for something to signal us to be awake */
ast_mutex_lock(&thread->lock);
+
+ /* Put into idle list if applicable */
+ if (put_into_idle)
+ insert_idle_thread(thread);
+
if (thread->type == IAX_THREAD_TYPE_DYNAMIC) {
/* Wait to be signalled or time out */
tv = ast_tvadd(ast_tvnow(), ast_samp2tv(30000, 1000));
@@ -7720,16 +7737,7 @@ static void *iax2_process_thread(void *data)
AST_LIST_REMOVE(&active_list, thread, list);
AST_LIST_UNLOCK(&active_list);
- /* Go back into our respective list */
- if (thread->type == IAX_THREAD_TYPE_DYNAMIC) {
- AST_LIST_LOCK(&dynamic_list);
- AST_LIST_INSERT_TAIL(&dynamic_list, thread, list);
- AST_LIST_UNLOCK(&dynamic_list);
- } else {
- AST_LIST_LOCK(&idle_list);
- AST_LIST_INSERT_TAIL(&idle_list, thread, list);
- AST_LIST_UNLOCK(&idle_list);
- }
+ put_into_idle = 1;
}
return NULL;