summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2006-12-18 17:18:18 +0000
committerJoshua Colp <jcolp@digium.com>2006-12-18 17:18:18 +0000
commitc17181aae3b4de82a4d5a27b0c73c069d830e413 (patch)
tree570c557ecc10ee410bcb4aaaad61953c1e272928 /channels
parenta504d9e64efeab39cf86d0118e3372ffcb228019 (diff)
Merged revisions 48564 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r48564 | file | 2006-12-18 12:15:49 -0500 (Mon, 18 Dec 2006) | 2 lines Put thread into proper list if we abort handling due to an error, and also hold the lock while putting it back into the proper idle list so we don't prematurely get a signal. (issue #8604 reported by arkadia) ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48565 65c4cc65-6c06-0410-ace0-fbb531ad65f3
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;