mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +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:
@@ -235,12 +235,16 @@ void ast_bridge_channel_update_linkedids(struct ast_bridge_channel *bridge_chann
|
||||
return;
|
||||
}
|
||||
|
||||
ast_channel_lock(bridge_channel->chan);
|
||||
ast_channel_linkedid_set(bridge_channel->chan, oldest_linkedid);
|
||||
ast_channel_unlock(bridge_channel->chan);
|
||||
AST_LIST_TRAVERSE(&bridge->channels, other, entry) {
|
||||
if (other == swap) {
|
||||
continue;
|
||||
}
|
||||
ast_channel_lock(other->chan);
|
||||
ast_channel_linkedid_set(other->chan, oldest_linkedid);
|
||||
ast_channel_unlock(other->chan);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,6 +257,7 @@ void ast_bridge_channel_update_accountcodes(struct ast_bridge_channel *bridge_ch
|
||||
if (other == swap) {
|
||||
continue;
|
||||
}
|
||||
ast_channel_lock_both(bridge_channel->chan, other->chan);
|
||||
|
||||
if (!ast_strlen_zero(ast_channel_accountcode(bridge_channel->chan)) && ast_strlen_zero(ast_channel_peeraccount(other->chan))) {
|
||||
ast_debug(1, "Setting peeraccount to %s for %s from data on channel %s\n",
|
||||
@@ -286,6 +291,8 @@ void ast_bridge_channel_update_accountcodes(struct ast_bridge_channel *bridge_ch
|
||||
ast_channel_peeraccount_set(bridge_channel->chan, ast_channel_accountcode(other->chan));
|
||||
}
|
||||
}
|
||||
ast_channel_unlock(bridge_channel->chan);
|
||||
ast_channel_unlock(other->chan);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,14 +631,18 @@ int ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, con
|
||||
datalen = 0;
|
||||
}
|
||||
|
||||
ast_channel_lock(bridge_channel->chan);
|
||||
ast_channel_publish_blob(bridge_channel->chan, ast_channel_hold_type(), blob);
|
||||
ast_channel_unlock(bridge_channel->chan);
|
||||
return ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_HOLD,
|
||||
moh_class, datalen);
|
||||
}
|
||||
|
||||
int ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel)
|
||||
{
|
||||
ast_channel_lock(bridge_channel->chan);
|
||||
ast_channel_publish_blob(bridge_channel->chan, ast_channel_unhold_type(), NULL);
|
||||
ast_channel_unlock(bridge_channel->chan);
|
||||
return ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_UNHOLD, NULL, 0);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user