From: Mark Michelson Date: Mon, 14 Apr 2008 14:58:02 +0000 (+0000) Subject: Save a local copy of the generate callback prior to unlocking the channel in X-Git-Tag: 1.4.20-rc1~65 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f689fffa71c239e10d3b706c8f12d7c5024bd260;p=thirdparty%2Fasterisk.git Save a local copy of the generate callback prior to unlocking the channel in case the generate callback goes NULL on us after the channel is unlocked. Thanks to Russell for pointing this need out to me. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@114106 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/channel.c b/main/channel.c index bdad4413c9..ff8277746b 100644 --- a/main/channel.c +++ b/main/channel.c @@ -1887,6 +1887,7 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram { if (chan->generatordata && !ast_internal_timing_enabled(chan)) { void *tmp = chan->generatordata; + int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = NULL; int res; if (chan->timingfunc) { @@ -1896,6 +1897,9 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram } chan->generatordata = NULL; /* reset, to let writes go through */ + if (chan->generator->generate) { + generate = chan->generator->generate; + } /* This unlock is here based on two assumptions that hold true at this point in the * code. 1) this function is only called from within __ast_read() and 2) all generators * call ast_write() in their generate callback. @@ -1905,7 +1909,7 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram * avoidance not to work in deeper functions */ ast_channel_unlock(chan); - res = chan->generator->generate(chan, tmp, f->datalen, f->samples); + res = generate(chan, tmp, f->datalen, f->samples); ast_channel_lock(chan); chan->generatordata = tmp; if (res) {