diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-16 16:09:11 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-16 16:09:11 +0000 |
commit | b11a4c724baba5cd0b3459d637d7f02594bfa660 (patch) | |
tree | a5ebeae94af53123bba1208a91e274643d8f31be | |
parent | a12161ad1f69dd874585f67a4bfd1720f836d08c (diff) |
Merged revisions 182211 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r182211 | tilghman | 2009-03-16 10:50:55 -0500 (Mon, 16 Mar 2009) | 14 lines
Merged revisions 182208 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r182208 | tilghman | 2009-03-16 10:39:15 -0500 (Mon, 16 Mar 2009) | 7 lines
Fixup glare detection, to fix a memory leak of a local pvt structure.
(closes issue #14656)
Reported by: caspy
Patches:
20090313__bug14656__2.diff.txt uploaded by tilghman (license 14)
Tested by: caspy
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@182212 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_local.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/channels/chan_local.c b/channels/chan_local.c index 3a0343b01..3200ec036 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -175,23 +175,17 @@ static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_fra /* Recalculate outbound channel */ other = isoutbound ? p->owner : p->chan; - /* Set glare detection */ - ast_set_flag(p, LOCAL_GLARE_DETECT); - if (ast_test_flag(p, LOCAL_CANCEL_QUEUE)) { - /* We had a glare on the hangup. Forget all this business, - return and destroy p. */ - ast_mutex_unlock(&p->lock); - p = local_pvt_destroy(p); - return -1; - } if (!other) { - ast_clear_flag(p, LOCAL_GLARE_DETECT); return 0; } /* do not queue frame if generator is on both local channels */ - if (us && us->generator && other->generator) + if (us && us->generator && other->generator) { return 0; + } + + /* Set glare detection */ + ast_set_flag(p, LOCAL_GLARE_DETECT); /* Ensure that we have both channels locked */ while (other && ast_channel_trylock(other)) { @@ -207,6 +201,17 @@ static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_fra other = isoutbound ? p->owner : p->chan; } + /* Since glare detection only occurs within this function, and because + * a pvt flag cannot be set without having the pvt lock, this is the only + * location where we could detect a cancelling of the queue. */ + if (ast_test_flag(p, LOCAL_CANCEL_QUEUE)) { + /* We had a glare on the hangup. Forget all this business, + return and destroy p. */ + ast_mutex_unlock(&p->lock); + p = local_pvt_destroy(p); + return -1; + } + if (other) { ast_queue_frame(other, f); ast_channel_unlock(other); |