Trustingly add Thorston's deadlock patch
authorMark Spencer <markster@digium.com>
Sat, 8 Nov 2003 04:35:57 +0000 (04:35 +0000)
committerMark Spencer <markster@digium.com>
Sat, 8 Nov 2003 04:35:57 +0000 (04:35 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1708 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CREDITS
apps/app_queue.c
channels/chan_agent.c

diff --git a/CREDITS b/CREDITS
index ffeb395..ade729e 100755 (executable)
--- 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
index 1c3ab73..ee004f4 100755 (executable)
@@ -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;
 }
 
index 7421f5d..593de03 100755 (executable)
@@ -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 */