mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 11:25:35 +00:00
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
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user