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 /channels | |
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 'channels')
-rw-r--r-- | channels/chan_alsa.c | 2 | ||||
-rw-r--r-- | channels/chan_console.c | 2 | ||||
-rw-r--r-- | channels/chan_dahdi.c | 8 | ||||
-rw-r--r-- | channels/chan_gtalk.c | 4 | ||||
-rw-r--r-- | channels/chan_h323.c | 4 | ||||
-rw-r--r-- | channels/chan_iax2.c | 7 | ||||
-rw-r--r-- | channels/chan_jingle.c | 4 | ||||
-rw-r--r-- | channels/chan_mgcp.c | 4 | ||||
-rw-r--r-- | channels/chan_misdn.c | 14 | ||||
-rw-r--r-- | channels/chan_motif.c | 4 | ||||
-rw-r--r-- | channels/chan_nbs.c | 2 | ||||
-rw-r--r-- | channels/chan_oss.c | 2 | ||||
-rw-r--r-- | channels/chan_phone.c | 2 | ||||
-rw-r--r-- | channels/chan_pjsip.c | 13 | ||||
-rw-r--r-- | channels/chan_sip.c | 2 | ||||
-rw-r--r-- | channels/chan_skinny.c | 4 | ||||
-rw-r--r-- | channels/chan_unistim.c | 6 | ||||
-rw-r--r-- | channels/chan_vpb.cc | 2 | ||||
-rw-r--r-- | channels/sig_analog.c | 4 | ||||
-rw-r--r-- | channels/sig_pri.c | 2 |
20 files changed, 86 insertions, 6 deletions
diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c index 60bbacbb8..065eff551 100644 --- a/channels/chan_alsa.c +++ b/channels/chan_alsa.c @@ -581,6 +581,7 @@ static struct ast_channel *alsa_new(struct chan_alsa_pvt *p, int state, const ch if (!(tmp = ast_channel_alloc(1, state, 0, 0, "", p->exten, p->context, linkedid, 0, "ALSA/%s", indevname))) return NULL; + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); ast_channel_tech_set(tmp, &alsa_tech); @@ -601,6 +602,7 @@ static struct ast_channel *alsa_new(struct chan_alsa_pvt *p, int state, const ch ast_jb_configure(tmp, &global_jbconf); ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN) { if (ast_pbx_start(tmp)) { diff --git a/channels/chan_console.c b/channels/chan_console.c index 922c53b42..6f694c2c9 100644 --- a/channels/chan_console.c +++ b/channels/chan_console.c @@ -428,6 +428,7 @@ static struct ast_channel *console_new(struct console_pvt *pvt, const char *ext, return NULL; } + ast_channel_lock(chan); ast_channel_stage_snapshot(chan); ast_channel_tech_set(chan, &console_tech); @@ -444,6 +445,7 @@ static struct ast_channel *console_new(struct console_pvt *pvt, const char *ext, ast_jb_configure(chan, &global_jbconf); ast_channel_stage_snapshot_done(chan); + ast_channel_unlock(chan); if (state != AST_STATE_DOWN) { if (ast_pbx_start(chan)) { diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 2eba958a8..843254c56 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -1667,7 +1667,9 @@ static void publish_dahdichannel(struct ast_channel *chan, int span, const char return; } + ast_channel_lock(chan); ast_channel_publish_blob(chan, dahdichannel_type(), blob); + ast_channel_unlock(chan); } /*! @@ -8916,6 +8918,7 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb return NULL; } + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); if (callid) { @@ -9096,6 +9099,7 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb pbx_builtin_setvar_helper(tmp, v->name, v->value); ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); ast_module_ref(ast_module_info->self); @@ -9614,6 +9618,7 @@ static void *analog_ss_thread(void *data) getforward = 0; } else { res = tone_zone_play_tone(p->subs[idx].dfd, -1); + ast_channel_lock(chan); ast_channel_exten_set(chan, exten); if (!ast_strlen_zero(p->cid_num)) { if (!p->hidecallerid) @@ -9626,6 +9631,7 @@ static void *analog_ss_thread(void *data) ast_set_callerid(chan, NULL, p->cid_name, NULL); } ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); dahdi_ec_enable(p); res = ast_pbx_run(chan); if (res) { @@ -10389,8 +10395,10 @@ static void *analog_ss_thread(void *data) my_handle_notify_message(chan, p, flags, -1); + ast_channel_lock(chan); ast_setstate(chan, AST_STATE_RING); ast_channel_rings_set(chan, 1); + ast_channel_unlock(chan); p->ringt = p->ringt_base; res = ast_pbx_run(chan); if (res) { diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index d6a094941..72c01ac8d 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -1150,6 +1150,7 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i, return NULL; } + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); ast_channel_tech_set(tmp, >alk_tech); @@ -1226,6 +1227,7 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i, ast_jb_configure(tmp, &global_jbconf); ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN && ast_pbx_start(tmp)) { ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(tmp)); @@ -1419,7 +1421,9 @@ static int gtalk_newcall(struct gtalk *client, ikspak *pak) ast_format_cap_joint_copy(p->cap, p->peercap, p->jointcap); ast_mutex_unlock(&p->lock); + ast_channel_lock(chan); ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); if (ast_format_cap_is_empty(p->jointcap)) { ast_log(LOG_WARNING, "Capabilities don't match : us - %s, peer - %s, combined - %s \n", ast_getformatname_multiple(s1, BUFSIZ, p->cap), ast_getformatname_multiple(s2, BUFSIZ, p->peercap), diff --git a/channels/chan_h323.c b/channels/chan_h323.c index 22dba3c18..7ce098415 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -1061,6 +1061,9 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c ch = ast_channel_alloc(1, state, cid_num, cid_name, pvt->accountcode, pvt->exten, pvt->context, linkedid, pvt->amaflags, "H323/%s", host); /* Update usage counter */ ast_module_ref(ast_module_info->self); + if (ch) { + ast_channel_lock(ch); + } ast_mutex_lock(&pvt->lock); if (ch) { ast_channel_tech_set(ch, &oh323_tech); @@ -1139,6 +1142,7 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c } if (pvt->cd.transfer_capability >= 0) ast_channel_transfercapability_set(ch, pvt->cd.transfer_capability); + ast_channel_unlock(ch); if (state != AST_STATE_DOWN) { if (ast_pbx_start(ch)) { ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(ch)); diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index e27cc14c6..80081174e 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -5689,11 +5689,15 @@ static struct ast_channel *ast_iax2_new(int callno, int state, iax2_format capab /* Don't hold call lock */ ast_mutex_unlock(&iaxsl[callno]); tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, i->accountcode, i->exten, i->context, linkedid, i->amaflags, "IAX2/%s-%d", i->host, i->callno); + if (tmp) { + ast_channel_lock(tmp); + } ast_mutex_lock(&iaxsl[callno]); if (i != iaxs[callno]) { if (tmp) { /* unlock and relock iaxsl[callno] to preserve locking order */ ast_mutex_unlock(&iaxsl[callno]); + ast_channel_unlock(tmp); tmp = ast_channel_release(tmp); ast_mutex_lock(&iaxsl[callno]); } @@ -5803,6 +5807,7 @@ static struct ast_channel *ast_iax2_new(int callno, int state, iax2_format capab } ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN) { if (ast_pbx_start(tmp)) { @@ -12234,7 +12239,9 @@ static struct ast_channel *iax2_request(const char *type, struct ast_format_cap if (c) { struct ast_format_cap *joint; if (callid) { + ast_channel_lock(c); ast_channel_callid_set(c, callid); + ast_channel_unlock(c); } /* Choose a format we can live with */ diff --git a/channels/chan_jingle.c b/channels/chan_jingle.c index 56c15b193..8604d4eb9 100644 --- a/channels/chan_jingle.c +++ b/channels/chan_jingle.c @@ -864,6 +864,7 @@ static struct ast_channel *jingle_new(struct jingle *client, struct jingle_pvt * return NULL; } + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); ast_channel_tech_set(tmp, &jingle_tech); @@ -941,6 +942,7 @@ static struct ast_channel *jingle_new(struct jingle *client, struct jingle_pvt * ast_jb_configure(tmp, &global_jbconf); ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN && ast_pbx_start(tmp)) { ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(tmp)); @@ -1115,7 +1117,9 @@ static int jingle_newcall(struct jingle *client, ikspak *pak) } ast_mutex_unlock(&p->lock); + ast_channel_lock(chan); ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); res = ast_pbx_start(chan); switch (res) { diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index 84fb3b225..c10697158 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -1507,6 +1507,7 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state, cons tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, linkedid, i->accountcode, i->exten, i->context, i->amaflags, "MGCP/%s@%s-%d", i->name, i->parent->name, sub->id); if (tmp) { + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); ast_channel_tech_set(tmp, &mgcp_tech); ast_format_cap_copy(ast_channel_nativeformats(tmp), i->cap); @@ -1570,6 +1571,7 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state, cons } ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN) { if (ast_pbx_start(tmp)) { @@ -3046,6 +3048,7 @@ static void *mgcp_ss(void *data) } else { /*res = tone_zone_play_tone(p->subs[index].zfd, -1);*/ ast_indicate(chan, -1); + ast_channel_lock(chan); ast_channel_exten_set(chan, p->dtmf_buf); ast_channel_dialed(chan)->number.str = ast_strdup(p->dtmf_buf); memset(p->dtmf_buf, 0, sizeof(p->dtmf_buf)); @@ -3054,6 +3057,7 @@ static void *mgcp_ss(void *data) p->hidecallerid ? "" : p->cid_name, ast_channel_caller(chan)->ani.number.valid ? NULL : p->cid_num); ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); if (p->dtmfmode & MGCP_DTMF_HYBRID) { p->dtmfmode |= MGCP_DTMF_INBAND; ast_indicate(chan, -1); diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 38197c638..a1b9105e6 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -5954,7 +5954,9 @@ static int read_config(struct chan_list *ch) chan_misdn_log(1, port, "read_config: Getting Config\n"); misdn_cfg_get(port, MISDN_CFG_LANGUAGE, lang, sizeof(lang)); + ast_channel_lock(ast); ast_channel_language_set(ast, lang); + ast_channel_unlock(ast); misdn_cfg_get(port, MISDN_CFG_MUSICCLASS, ch->mohinterpret, sizeof(ch->mohinterpret)); @@ -6000,7 +6002,9 @@ static int read_config(struct chan_list *ch) misdn_cfg_get(bc->port, MISDN_CFG_CONTEXT, ch->context, sizeof(ch->context)); + ast_channel_lock(ast); ast_channel_context_set(ast, ch->context); + ast_channel_unlock(ast); #ifdef MISDN_1_2 update_pipeline_config(bc); @@ -6017,8 +6021,10 @@ static int read_config(struct chan_list *ch) misdn_cfg_get(port, MISDN_CFG_PICKUPGROUP, &pg, sizeof(pg)); misdn_cfg_get(port, MISDN_CFG_CALLGROUP, &cg, sizeof(cg)); chan_misdn_log(5, port, " --> * CallGrp:%s PickupGrp:%s\n", ast_print_group(buf, sizeof(buf), cg), ast_print_group(buf2, sizeof(buf2), pg)); + ast_channel_lock(ast); ast_channel_pickupgroup_set(ast, pg); ast_channel_callgroup_set(ast, cg); + ast_channel_unlock(ast); misdn_cfg_get(port, MISDN_CFG_NAMEDPICKUPGROUP, &npg, sizeof(npg)); misdn_cfg_get(port, MISDN_CFG_NAMEDCALLGROUP, &ncg, sizeof(ncg)); @@ -6031,8 +6037,10 @@ static int read_config(struct chan_list *ch) ast_free(tmp_str); } + ast_channel_lock(ast); ast_channel_named_pickupgroups_set(ast, npg); ast_channel_named_callgroups_set(ast, ncg); + ast_channel_unlock(ast); if (ch->originator == ORG_AST) { char callerid[BUFFERSIZE + 1]; @@ -6086,7 +6094,9 @@ static int read_config(struct chan_list *ch) /* Add configured prefix to dialed.number */ misdn_add_number_prefix(bc->port, bc->dialed.number_type, bc->dialed.number, sizeof(bc->dialed.number)); + ast_channel_lock(ast); ast_channel_exten_set(ast, bc->dialed.number); + ast_channel_unlock(ast); misdn_cfg_get(bc->port, MISDN_CFG_OVERLAP_DIAL, &ch->overlap_dial, sizeof(ch->overlap_dial)); ast_mutex_init(&ch->overlap_tv_lock); @@ -10228,8 +10238,10 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) export_ch(chan, bc, ch); + ast_channel_lock(ch->ast); ast_channel_rings_set(ch->ast, 1); ast_setstate(ch->ast, AST_STATE_RINGING); + ast_channel_unlock(ch->ast); /* Update asterisk channel caller information */ chan_misdn_log(2, bc->port, " --> TON: %s(%d)\n", misdn_to_str_ton(bc->caller.number_type), bc->caller.number_type); @@ -10528,7 +10540,9 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) } ast_queue_control(ch->ast, AST_CONTROL_RINGING); + ast_channel_lock(ch->ast); ast_setstate(ch->ast, AST_STATE_RINGING); + ast_channel_unlock(ch->ast); cb_log(7, bc->port, " --> Set State Ringing\n"); diff --git a/channels/chan_motif.c b/channels/chan_motif.c index 1e7ee3cce..85234ad3a 100644 --- a/channels/chan_motif.c +++ b/channels/chan_motif.c @@ -785,6 +785,7 @@ static struct ast_channel *jingle_new(struct jingle_endpoint *endpoint, struct j if (!(chan = ast_channel_alloc(1, state, S_OR(title, ""), S_OR(cid_name, ""), "", "", "", linkedid, 0, "Motif/%s-%04lx", str, ast_random() & 0xffff))) { return NULL; } + ast_channel_lock(chan); ast_channel_stage_snapshot(chan); @@ -852,6 +853,7 @@ static struct ast_channel *jingle_new(struct jingle_endpoint *endpoint, struct j ao2_unlock(endpoint); ast_channel_stage_snapshot_done(chan); + ast_channel_unlock(chan); return chan; } @@ -2412,7 +2414,9 @@ static void jingle_action_session_initiate(struct jingle_endpoint *endpoint, str ao2_link(endpoint->state->sessions, session); + ast_channel_lock(chan); ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); res = ast_pbx_start(chan); switch (res) { diff --git a/channels/chan_nbs.c b/channels/chan_nbs.c index 1d8c59d4e..41f696207 100644 --- a/channels/chan_nbs.c +++ b/channels/chan_nbs.c @@ -223,6 +223,7 @@ static struct ast_channel *nbs_new(struct nbs_pvt *i, int state, const char *lin struct ast_channel *tmp; tmp = ast_channel_alloc(1, state, 0, 0, "", "s", context, linkedid, 0, "NBS/%s", i->stream); if (tmp) { + ast_channel_lock(tmp); ast_channel_tech_set(tmp, &nbs_tech); ast_channel_set_fd(tmp, 0, nbs_fd(i->nbs)); @@ -239,6 +240,7 @@ static struct ast_channel *nbs_new(struct nbs_pvt *i, int state, const char *lin ast_channel_language_set(tmp, ""); i->owner = tmp; i->u = ast_module_user_add(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN) { if (ast_pbx_start(tmp)) { ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(tmp)); diff --git a/channels/chan_oss.c b/channels/chan_oss.c index 5ae18f362..92c7374db 100644 --- a/channels/chan_oss.c +++ b/channels/chan_oss.c @@ -799,6 +799,7 @@ static struct ast_channel *oss_new(struct chan_oss_pvt *o, char *ext, char *ctx, c = ast_channel_alloc(1, state, o->cid_num, o->cid_name, "", ext, ctx, linkedid, 0, "Console/%s", o->device + 5); if (c == NULL) return NULL; + ast_channel_lock(c); ast_channel_tech_set(c, &oss_tech); if (o->sounddev < 0) setformat(o, O_RDWR); @@ -829,6 +830,7 @@ static struct ast_channel *oss_new(struct chan_oss_pvt *o, char *ext, char *ctx, o->owner = c; ast_module_ref(ast_module_info->self); ast_jb_configure(c, &global_jbconf); + ast_channel_unlock(c); if (state != AST_STATE_DOWN) { if (ast_pbx_start(c)) { ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(c)); diff --git a/channels/chan_phone.c b/channels/chan_phone.c index c1a24b8b1..ca69a2f69 100644 --- a/channels/chan_phone.c +++ b/channels/chan_phone.c @@ -862,6 +862,7 @@ static struct ast_channel *phone_new(struct phone_pvt *i, int state, char *cntx, struct ast_format tmpfmt; tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, "", i->ext, i->context, linkedid, 0, "Phone/%s", i->dev + 5); if (tmp) { + ast_channel_lock(tmp); ast_channel_tech_set(tmp, cur_tech); ast_channel_set_fd(tmp, 0, i->fd); /* XXX Switching formats silently causes kernel panics XXX */ @@ -898,6 +899,7 @@ static struct ast_channel *phone_new(struct phone_pvt *i, int state, char *cntx, ast_channel_caller(tmp)->ani.number.valid = 1; ast_channel_caller(tmp)->ani.number.str = ast_strdup(i->cid_num); } + ast_channel_unlock(tmp); i->owner = tmp; ast_module_ref(ast_module_info->self); diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 80cf270af..12fb45969 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -577,13 +577,15 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s return NULL; } - ast_channel_stage_snapshot(chan); - /* If res_pjsip_session is ever updated to create/destroy ast_sip_session_media * during a call such as if multiple same-type stream support is introduced, * these will need to be recaptured as well */ pvt->media[SIP_MEDIA_AUDIO] = ao2_find(session->media, "audio", OBJ_KEY); pvt->media[SIP_MEDIA_VIDEO] = ao2_find(session->media, "video", OBJ_KEY); + + ast_channel_lock(chan); + ast_channel_stage_snapshot(chan); + ast_channel_tech_pvt_set(chan, channel); if (pvt->media[SIP_MEDIA_AUDIO] && pvt->media[SIP_MEDIA_AUDIO]->rtp) { ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_AUDIO]->rtp, ast_channel_uniqueid(chan)); @@ -632,9 +634,10 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s ast_channel_zone_set(chan, zone); } - ast_endpoint_add_channel(session->endpoint->persistent, chan); - ast_channel_stage_snapshot_done(chan); + ast_channel_unlock(chan); + + ast_endpoint_add_channel(session->endpoint->persistent, chan); return chan; } @@ -2030,9 +2033,11 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct switch (status.code) { case 180: ast_queue_control(session->channel, AST_CONTROL_RINGING); + ast_channel_lock(session->channel); if (ast_channel_state(session->channel) != AST_STATE_UP) { ast_setstate(session->channel, AST_STATE_RINGING); } + ast_channel_unlock(session->channel); break; case 183: ast_queue_control(session->channel, AST_CONTROL_PROGRESS); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c56f7c4c9..fafe71257 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -8106,6 +8106,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit } } + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); /* If we sent in a callid, bind it to the channel. */ @@ -8113,7 +8114,6 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit ast_channel_callid_set(tmp, callid); } - ast_channel_lock(tmp); sip_pvt_lock(i); ast_channel_cc_params_init(tmp, i->cc_params); ast_channel_caller(tmp)->id.tag = ast_strdup(i->cid_tag); diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index a65862ff3..191c3cc24 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -4845,6 +4845,7 @@ static void *skinny_newcall(void *data) struct skinny_device *d = l->device; int res = 0; + ast_channel_lock(c); ast_set_callerid(c, l->hidecallerid ? "" : l->cid_num, l->hidecallerid ? "" : l->cid_name, @@ -4858,6 +4859,7 @@ static void *skinny_newcall(void *data) ast_party_name_init(&ast_channel_connected(c)->id.name); #endif ast_setstate(c, AST_STATE_RING); + ast_channel_unlock(c); if (!sub->rtp) { start_rtp(sub); } @@ -5424,6 +5426,7 @@ static struct ast_channel *skinny_new(struct skinny_line *l, struct skinny_subli AST_LIST_INSERT_HEAD(&l->sub, sub, list); //l->activesub = sub; } + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); ast_channel_tech_set(tmp, &skinny_tech); ast_channel_tech_pvt_set(tmp, sub); @@ -5499,6 +5502,7 @@ static struct ast_channel *skinny_new(struct skinny_line *l, struct skinny_subli pbx_builtin_setvar_helper(tmp, v->name, v->value); ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN) { if (ast_pbx_start(tmp)) { diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c index 547cd7c2f..93fd9c502 100644 --- a/channels/chan_unistim.c +++ b/channels/chan_unistim.c @@ -2517,10 +2517,12 @@ static void *unistim_ss(void *data) int res; ast_verb(3, "Starting switch on '%s@%s-%d' to %s\n", l->name, l->parent->name, sub->softkey, s->device->phone_number); + ast_channel_lock(chan); ast_channel_exten_set(chan, s->device->phone_number); + ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); ast_copy_string(s->device->redial_number, s->device->phone_number, sizeof(s->device->redial_number)); - ast_setstate(chan, AST_STATE_RING); res = ast_pbx_run(chan); if (res) { ast_log(LOG_WARNING, "PBX exited non-zero\n"); @@ -5563,6 +5565,7 @@ static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state return NULL; } + ast_channel_lock(tmp); ast_channel_stage_snapshot(tmp); ast_format_cap_copy(ast_channel_nativeformats(tmp), l->cap); @@ -5627,6 +5630,7 @@ static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state ast_channel_priority_set(tmp, 1); ast_channel_stage_snapshot_done(tmp); + ast_channel_unlock(tmp); if (state != AST_STATE_DOWN) { if (unistimdebug) { diff --git a/channels/chan_vpb.cc b/channels/chan_vpb.cc index 12f27249b..6ee0e0618 100644 --- a/channels/chan_vpb.cc +++ b/channels/chan_vpb.cc @@ -2439,6 +2439,7 @@ static struct ast_channel *vpb_new(struct vpb_pvt *me, enum ast_channel_state st tmp = ast_channel_alloc(1, state, 0, 0, "", me->ext, me->context, linkedid, AST_AMA_NONE, "%s", me->dev); if (tmp) { + ast_channel_lock(tmp); if (use_ast_ind == 1){ ast_channel_tech_set(tmp, &vpb_tech_indicate); } else { @@ -2471,6 +2472,7 @@ static struct ast_channel *vpb_new(struct vpb_pvt *me, enum ast_channel_state st ast_channel_exten_set(tmp, "s"); if (!ast_strlen_zero(me->language)) ast_channel_language_set(tmp, me->language); + ast_channel_unlock(tmp); me->owner = tmp; diff --git a/channels/sig_analog.c b/channels/sig_analog.c index bbf7a3c8c..51d3f1495 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -2120,6 +2120,7 @@ static void *__analog_ss_thread(void *data) getforward = 0; } else { res = analog_play_tone(p, idx, -1); + ast_channel_lock(chan); ast_channel_exten_set(chan, exten); if (!ast_strlen_zero(p->cid_num)) { if (!p->hidecallerid) { @@ -2134,6 +2135,7 @@ static void *__analog_ss_thread(void *data) } } ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); analog_set_echocanceller(p, 1); res = ast_pbx_run(chan); if (res) { @@ -2615,8 +2617,10 @@ static void *__analog_ss_thread(void *data) analog_handle_notify_message(chan, p, flags, -1); + ast_channel_lock(chan); ast_setstate(chan, AST_STATE_RING); ast_channel_rings_set(chan, 1); + ast_channel_unlock(chan); analog_set_ringtimeout(p, p->ringt_base); res = ast_pbx_run(chan); if (res) { diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 5def34c23..48c8c33d7 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -2160,7 +2160,9 @@ static void *pri_ss_thread(void *data) #endif /* defined(ISSUE_16789) */ sig_pri_set_echocanceller(p, 1); + ast_channel_lock(chan); ast_setstate(chan, AST_STATE_RING); + ast_channel_unlock(chan); res = ast_pbx_run(chan); if (res) { ast_log(LOG_WARNING, "PBX exited non-zero!\n"); |