diff --git a/CREDITS b/CREDITS index ffeb39539..ade729ebe 100755 --- a/CREDITS +++ b/CREDITS @@ -47,6 +47,9 @@ Tilghman Lesher - Route lookup code, gotoiftime application, and various other patches. http://asterisk.drunkcoder.com/ Jayson Vantuyl - Manager protocol changes, various other bugs. jvantuyl@computingedge.net +Thorsten Lockert - OpenBSD, FreeBSD ports, making MacOS X port run on 10.3, + dialplan include verification, route lookup on OpenBSD, various other + bugs. tholo@sigmasoft.com === OTHER CONTRIBUTIONS === John Todd - Monkey sounds and associated teletorture prompt diff --git a/apps/app_queue.c b/apps/app_queue.c index 1c3ab73b2..ee004f429 100755 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -609,10 +609,8 @@ static int wait_our_turn(struct queue_ent *qe) struct queue_ent *ch; int res = 0; for (;;) { - /* Atomically read the parent head */ - ast_mutex_lock(&qe->parent->lock); + /* Atomically read the parent head -- does not need a lock */ ch = qe->parent->head; - ast_mutex_unlock(&qe->parent->lock); /* If we are now at the top of the head, break out */ if (qe->parent->head == qe) break; @@ -722,6 +720,7 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri /* Get a technology/[device:]number pair */ tmp = malloc(sizeof(struct localuser)); if (!tmp) { + ast_mutex_unlock(&qe->parent->lock); ast_log(LOG_WARNING, "Out of memory\n"); goto out; } @@ -859,11 +858,8 @@ out: static int wait_a_bit(struct queue_ent *qe) { - int retrywait; - /* Hold the lock while we setup the outgoing calls */ - ast_mutex_lock(&qe->parent->lock); - retrywait = qe->parent->retry * 1000; - ast_mutex_unlock(&qe->parent->lock); + /* Don't need to hold the lock while we setup the outgoing calls */ + int retrywait = qe->parent->retry * 1000; return ast_waitfordigit(qe->chan, retrywait); } @@ -1203,6 +1199,7 @@ static void reload_queues(void) /* Mark all queues as dead for the moment */ q = queues; while(q) { + q->dead = 1; q = q->next; } /* Chug through config file */ @@ -1349,8 +1346,10 @@ static int queues_show(int fd, int argc, char **argv) time(&now); if (argc != 2) return RESULT_SHOWUSAGE; + ast_mutex_lock(&qlock); q = queues; if (!q) { + ast_mutex_unlock(&qlock); ast_cli(fd, "No queues.\n"); return RESULT_SUCCESS; } @@ -1391,6 +1390,7 @@ static int queues_show(int fd, int argc, char **argv) ast_mutex_unlock(&q->lock); q = q->next; } + ast_mutex_unlock(&qlock); return RESULT_SUCCESS; } @@ -1413,6 +1413,7 @@ static int manager_queues_status( struct mansession *s, struct message *m ) struct queue_ent *qe; astman_send_ack(s, m, "Queue status will follow"); time(&now); + ast_mutex_lock(&qlock); q = queues; if (id && &id) { snprintf(idText,256,"ActionID: %s\r\n",id); @@ -1445,6 +1446,7 @@ static int manager_queues_status( struct mansession *s, struct message *m ) ast_mutex_unlock(&q->lock); q = q->next; } + ast_mutex_unlock(&qlock); return RESULT_SUCCESS; } diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 7421f5d53..593de03cf 100755 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -1154,10 +1154,14 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode) if( options ) if( strchr( options, 's' ) ) play_announcement = 0; + ast_mutex_unlock(&p->lock); + ast_mutex_unlock(&agentlock); if( !res && play_announcement ) res = ast_streamfile(chan, filename, chan->language); if (!res) ast_waitstream(chan, ""); + ast_mutex_lock(&agentlock); + ast_mutex_lock(&p->lock); if (!res) { res = ast_set_read_format(chan, ast_best_codec(chan->nativeformats)); if (res) @@ -1173,6 +1177,7 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode) res = -1; if (callbackmode && !res) { /* Just say goodbye and be done with it */ + ast_mutex_unlock(&agentlock); if (!res) res = ast_safe_sleep(chan, 500); res = ast_streamfile(chan, "vm-goodbye", chan->language); @@ -1181,7 +1186,6 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode) if (!res) res = ast_safe_sleep(chan, 1000); ast_mutex_unlock(&p->lock); - ast_mutex_unlock(&agentlock); } else if (!res) { #ifdef HONOR_MUSIC_CLASS /* check if the moh class was changed with setmusiconhold */