Really fix chan local races (I hope)
authorMark Spencer <markster@digium.com>
Tue, 2 Dec 2003 15:52:37 +0000 (15:52 +0000)
committerMark Spencer <markster@digium.com>
Tue, 2 Dec 2003 15:52:37 +0000 (15:52 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1813 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_local.c

index 8cc057b..1e11c7b 100755 (executable)
@@ -74,15 +74,15 @@ static struct local_pvt {
 static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_frame *f, struct ast_channel *us)
 {
        struct ast_channel *other;
+retrylock:             
+       /* Recalculate outbound channel */
        if (isoutbound) {
                other = p->owner;
        } else {
                other = p->chan;
        }
-       if (!other)
-               return 0;
+       /* Set glare detection */
        p->glaredetect = 1;
-retrylock:             
        if (p->cancelqueue) {
                /* We had a glare on the hangup.  Forget all this business,
                return and destroy p.  */
@@ -90,6 +90,10 @@ retrylock:
                free(p);
                return -1;
        }
+       if (!other) {
+               p->glaredetect = 0;
+               return 0;
+       }
        if (ast_mutex_trylock(&other->lock)) {
                /* Failed to lock.  Release main lock and try again */
                ast_mutex_unlock(&p->lock);