diff options
author | Mark Michelson <mmichelson@digium.com> | 2013-12-03 17:07:29 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2013-12-03 17:07:29 +0000 |
commit | 8e8b329e14ad2e4d747c4c4eb33c118305401aee (patch) | |
tree | 200a9b111d9cf75ab980aedf53ee714b7cc398f2 /res/res_agi.c | |
parent | 8b24b0d20647697c9ee899dea85871465c3032cb (diff) |
Add channel locking for channel snapshot creation.
This adds channel locks around calls to create channel snapshots as well
as other functions which operate on a channel and then end up
creating a channel snapshot. Functions that expect the channel to be
locked prior to being called have had their documentation updated to
indicate such.
........
Merged revisions 403311 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@403314 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_agi.c')
-rw-r--r-- | res/res_agi.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/res/res_agi.c b/res/res_agi.c index ed70356dd..96d3906ac 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -1481,9 +1481,11 @@ static enum agi_result launch_asyncagi(struct ast_channel *chan, int argc, char to execute based on the setup info */ ast_uri_encode(agi_buffer, ami_buffer, AMI_BUF_SIZE, ast_uri_http); startblob = ast_json_pack("{s: s}", "Env", ami_buffer); + ast_channel_lock(chan); ast_channel_publish_blob(chan, agi_async_start_type(), startblob); hungup = ast_check_hangup(chan); + ast_channel_unlock(chan); for (;;) { /* * Process as many commands as we can. Commands are added via @@ -1527,7 +1529,9 @@ static enum agi_result launch_asyncagi(struct ast_channel *chan, int argc, char if (execblob && !ast_strlen_zero(cmd->cmd_id)) { ast_json_object_set(execblob, "CommandId", ast_json_string_create(cmd->cmd_id)); } + ast_channel_lock(chan); ast_channel_publish_blob(chan, agi_async_exec_type(), execblob); + ast_channel_unlock(chan); free_agi_cmd(cmd); @@ -1587,7 +1591,9 @@ async_agi_done: ast_speech_destroy(async_agi.speech); } /* notify manager users this channel cannot be controlled anymore by Async AGI */ + ast_channel_lock(chan); ast_channel_publish_blob(chan, agi_async_end_type(), NULL); + ast_channel_unlock(chan); async_agi_abort: /* close the pipe */ @@ -2716,7 +2722,9 @@ static int handle_autohangup(struct ast_channel *chan, AGI *agi, int argc, const whentohangup.tv_sec = timeout; whentohangup.tv_usec = (timeout - whentohangup.tv_sec) * 1000000.0; } + ast_channel_lock(chan); ast_channel_setwhentohangup_tv(chan, whentohangup); + ast_channel_unlock(chan); ast_agi_send(agi->fd, chan, "200 result=0\n"); return RESULT_SUCCESS; } @@ -3657,7 +3665,9 @@ static void publish_async_exec_end(struct ast_channel *chan, int command_id, con "Command", command, "ResultCode", result_code, "Result", result); + ast_channel_lock(chan); ast_channel_publish_blob(chan, agi_exec_end_type(), blob); + ast_channel_unlock(chan); } static enum agi_result agi_handle_command(struct ast_channel *chan, AGI *agi, char *buf, int dead) @@ -3675,7 +3685,9 @@ static enum agi_result agi_handle_command(struct ast_channel *chan, AGI *agi, ch startblob = ast_json_pack("{s: i, s: s}", "CommandId", command_id, "Command", ami_cmd); + ast_channel_lock(chan); ast_channel_publish_blob(chan, agi_exec_start_type(), startblob); + ast_channel_unlock(chan); parse_args(buf, &argc, argv); c = find_command(argv, 0); |