summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2013-10-02 16:23:34 +0000
committerJoshua Colp <jcolp@digium.com>2013-10-02 16:23:34 +0000
commitc1235f2639023a9e450cafcdf8bd35cc304d9e53 (patch)
treeb48cb7bb27925ff48e4f807dda8ee9588fd36031 /channels
parent424c0f2eb7ff45a06a21b2d81532ac49e24e8b60 (diff)
Reduce channel snapshot creation and publishing by up to 50%.
This change introduces the ability to stage channel snapshot creation and publishing by suppressing the implicit creation and publishing that some functions have. Once all operations are executed the staging is marked as done and a single snapshot is created and published. Review: https://reviewboard.asterisk.org/r/2889/ ........ Merged revisions 400265 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@400266 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_alsa.c6
-rw-r--r--channels/chan_console.c5
-rw-r--r--channels/chan_dahdi.c4
-rw-r--r--channels/chan_gtalk.c6
-rw-r--r--channels/chan_iax2.c5
-rw-r--r--channels/chan_jingle.c7
-rw-r--r--channels/chan_mgcp.c5
-rw-r--r--channels/chan_motif.c5
-rw-r--r--channels/chan_pjsip.c4
-rw-r--r--channels/chan_sip.c19
-rw-r--r--channels/chan_skinny.c4
-rw-r--r--channels/chan_unistim.c7
-rw-r--r--channels/sig_pri.c5
-rw-r--r--channels/sig_ss7.c4
14 files changed, 85 insertions, 1 deletions
diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c
index 7f54d6cfa..f1720ba8c 100644
--- a/channels/chan_alsa.c
+++ b/channels/chan_alsa.c
@@ -62,6 +62,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/abstract_jb.h"
#include "asterisk/musiconhold.h"
#include "asterisk/poll-compat.h"
+#include "asterisk/stasis_channels.h"
/*! Global jitterbuffer configuration - by default, jb is disabled
* \note Values shown here match the defaults shown in alsa.conf.sample */
@@ -580,6 +581,8 @@ 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_stage_snapshot(tmp);
+
ast_channel_tech_set(tmp, &alsa_tech);
ast_channel_set_fd(tmp, 0, readdev);
ast_format_set(ast_channel_readformat(tmp), AST_FORMAT_SLINEAR, 0);
@@ -596,6 +599,9 @@ static struct ast_channel *alsa_new(struct chan_alsa_pvt *p, int state, const ch
p->owner = tmp;
ast_module_ref(ast_module_info->self);
ast_jb_configure(tmp, &global_jbconf);
+
+ ast_channel_stage_snapshot_done(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_console.c b/channels/chan_console.c
index 0f4d01ebd..76571d209 100644
--- a/channels/chan_console.c
+++ b/channels/chan_console.c
@@ -76,6 +76,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/musiconhold.h"
#include "asterisk/callerid.h"
#include "asterisk/astobj2.h"
+#include "asterisk/stasis_channels.h"
/*!
* \brief The sample rate to request from PortAudio
@@ -427,6 +428,8 @@ static struct ast_channel *console_new(struct console_pvt *pvt, const char *ext,
return NULL;
}
+ ast_channel_stage_snapshot(chan);
+
ast_channel_tech_set(chan, &console_tech);
ast_format_set(ast_channel_readformat(chan), AST_FORMAT_SLINEAR16, 0);
ast_format_set(ast_channel_writeformat(chan), AST_FORMAT_SLINEAR16, 0);
@@ -440,6 +443,8 @@ 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);
+
if (state != AST_STATE_DOWN) {
if (ast_pbx_start(chan)) {
ast_channel_hangupcause_set(chan, AST_CAUSE_SWITCH_CONGESTION);
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 853c5f4e7..65a9758f2 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -8910,6 +8910,8 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb
return NULL;
}
+ ast_channel_stage_snapshot(tmp);
+
if (callid) {
ast_channel_callid_set(tmp, callid);
}
@@ -9087,6 +9089,8 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb
for (v = i->vars ; v ; v = v->next)
pbx_builtin_setvar_helper(tmp, v->name, v->value);
+ ast_channel_stage_snapshot_done(tmp);
+
ast_module_ref(ast_module_info->self);
dahdi_ami_channel_event(i, tmp);
diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c
index fc1b75a53..a44ca57f4 100644
--- a/channels/chan_gtalk.c
+++ b/channels/chan_gtalk.c
@@ -1149,6 +1149,9 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i,
ast_log(LOG_WARNING, "Unable to allocate Gtalk channel structure!\n");
return NULL;
}
+
+ ast_channel_stage_snapshot(tmp);
+
ast_channel_tech_set(tmp, &gtalk_tech);
/* Select our native format based on codec preference until we receive
@@ -1221,6 +1224,9 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i,
ast_channel_priority_set(tmp, 1);
if (i->rtp)
ast_jb_configure(tmp, &global_jbconf);
+
+ ast_channel_stage_snapshot_done(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));
ast_channel_hangupcause_set(tmp, AST_CAUSE_SWITCH_CONGESTION);
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index b880f5d94..62888615f 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -116,6 +116,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/bridge.h"
#include "asterisk/stasis.h"
#include "asterisk/stasis_system.h"
+#include "asterisk/stasis_channels.h"
#include "iax2/include/iax2.h"
#include "iax2/include/firmware.h"
@@ -5702,6 +5703,8 @@ static struct ast_channel *ast_iax2_new(int callno, int state, iax2_format capab
return NULL;
}
+ ast_channel_stage_snapshot(tmp);
+
if ((callid = iaxs[callno]->callid)) {
ast_channel_callid_set(tmp, callid);
}
@@ -5799,6 +5802,8 @@ static struct ast_channel *ast_iax2_new(int callno, int state, iax2_format capab
}
}
+ ast_channel_stage_snapshot_done(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_jingle.c b/channels/chan_jingle.c
index e5fd02506..a8cab6238 100644
--- a/channels/chan_jingle.c
+++ b/channels/chan_jingle.c
@@ -79,6 +79,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/abstract_jb.h"
#include "asterisk/jabber.h"
#include "asterisk/jingle.h"
+#include "asterisk/stasis_channels.h"
#define JINGLE_CONFIG "jingle.conf"
@@ -862,6 +863,9 @@ static struct ast_channel *jingle_new(struct jingle *client, struct jingle_pvt *
ast_log(LOG_WARNING, "Unable to allocate Jingle channel structure!\n");
return NULL;
}
+
+ ast_channel_stage_snapshot(tmp);
+
ast_channel_tech_set(tmp, &jingle_tech);
/* Select our native format based on codec preference until we receive
@@ -935,6 +939,9 @@ static struct ast_channel *jingle_new(struct jingle *client, struct jingle_pvt *
ast_channel_priority_set(tmp, 1);
if (i->rtp)
ast_jb_configure(tmp, &global_jbconf);
+
+ ast_channel_stage_snapshot_done(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));
ast_channel_hangupcause_set(tmp, AST_CAUSE_SWITCH_CONGESTION);
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c
index 8fcdebfad..7c9120088 100644
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -85,6 +85,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/bridge.h"
#include "asterisk/features_config.h"
#include "asterisk/parking.h"
+#include "asterisk/stasis_channels.h"
/*
* Define to work around buggy dlink MGCP phone firmware which
@@ -1506,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_stage_snapshot(tmp);
ast_channel_tech_set(tmp, &mgcp_tech);
ast_format_cap_copy(ast_channel_nativeformats(tmp), i->cap);
if (ast_format_cap_is_empty(ast_channel_nativeformats(tmp))) {
@@ -1566,6 +1568,9 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state, cons
if (sub->rtp) {
ast_jb_configure(tmp, &global_jbconf);
}
+
+ ast_channel_stage_snapshot_done(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_motif.c b/channels/chan_motif.c
index 72118ce10..e13c66c6f 100644
--- a/channels/chan_motif.c
+++ b/channels/chan_motif.c
@@ -76,6 +76,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/astobj.h"
#include "asterisk/abstract_jb.h"
#include "asterisk/xmpp.h"
+#include "asterisk/stasis_channels.h"
/*** DOCUMENTATION
<configInfo name="chan_motif" language="en_US">
@@ -785,6 +786,8 @@ static struct ast_channel *jingle_new(struct jingle_endpoint *endpoint, struct j
return NULL;
}
+ ast_channel_stage_snapshot(chan);
+
ast_channel_tech_set(chan, &jingle_tech);
ast_channel_tech_pvt_set(chan, session);
jingle_set_owner(session, chan);
@@ -848,6 +851,8 @@ static struct ast_channel *jingle_new(struct jingle_endpoint *endpoint, struct j
ao2_unlock(endpoint);
+ ast_channel_stage_snapshot_done(chan);
+
return chan;
}
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 42e329e50..fcca25c8d 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -577,6 +577,8 @@ 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 */
@@ -632,6 +634,8 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
ast_endpoint_add_channel(session->endpoint->persistent, chan);
+ ast_channel_stage_snapshot_done(chan);
+
return chan;
}
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 2a821dd73..497fb6e61 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7285,6 +7285,10 @@ static int sip_hangup(struct ast_channel *ast)
} while (sip_pvt_trylock(p));
}
+ if (p->rtp || p->vrtp || p->trtp) {
+ ast_channel_stage_snapshot(oldowner);
+ }
+
if (p->rtp) {
ast_rtp_instance_set_stats_vars(oldowner, p->rtp);
}
@@ -7320,6 +7324,9 @@ static int sip_hangup(struct ast_channel *ast)
}
pbx_builtin_setvar_helper(oldowner, "RTPTEXTQOS", quality);
}
+ if (p->rtp || p->vrtp || p->trtp) {
+ ast_channel_stage_snapshot_done(oldowner);
+ }
/* Send a hangup */
if (ast_channel_state(oldowner) == AST_STATE_UP) {
@@ -8092,6 +8099,8 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
}
}
+ ast_channel_stage_snapshot(tmp);
+
/* If we sent in a callid, bind it to the channel. */
if (callid) {
ast_channel_callid_set(tmp, callid);
@@ -8287,6 +8296,8 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
append_history(i, "NewChan", "Channel %s - from %s", ast_channel_name(tmp), i->callid);
}
+ ast_channel_stage_snapshot_done(tmp);
+
return tmp;
}
@@ -26531,6 +26542,10 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
}
}
+ if ((p->rtp || p->vrtp || p->trtp) && p->owner) {
+ ast_channel_stage_snapshot(p->owner);
+ }
+
/* Get RTCP quality before end of call */
if (p->rtp) {
if (p->do_history) {
@@ -26595,6 +26610,10 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
}
}
+ if ((p->rtp || p->vrtp || p->trtp) && p->owner) {
+ ast_channel_stage_snapshot_done(p->owner);
+ }
+
stop_media_flows(p); /* Immediately stop RTP, VRTP and UDPTL as applicable */
stop_session_timer(p); /* Stop Session-Timer */
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index 7cf592a26..496de1866 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -82,6 +82,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/stasis_endpoints.h"
#include "asterisk/bridge.h"
#include "asterisk/parking.h"
+#include "asterisk/stasis_channels.h"
/*** DOCUMENTATION
<manager name="SKINNYdevices" language="en_US">
@@ -5423,6 +5424,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_stage_snapshot(tmp);
ast_channel_tech_set(tmp, &skinny_tech);
ast_channel_tech_pvt_set(tmp, sub);
ast_format_cap_copy(ast_channel_nativeformats(tmp), l->cap);
@@ -5496,6 +5498,8 @@ static struct ast_channel *skinny_new(struct skinny_line *l, struct skinny_subli
for (v = l->chanvars ; v ; v = v->next)
pbx_builtin_setvar_helper(tmp, v->name, v->value);
+ ast_channel_stage_snapshot_done(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_unistim.c b/channels/chan_unistim.c
index adb5cb9c8..523867988 100644
--- a/channels/chan_unistim.c
+++ b/channels/chan_unistim.c
@@ -77,7 +77,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/astdb.h"
#include "asterisk/features_config.h"
#include "asterisk/bridge.h"
-
+#include "asterisk/stasis_channels.h"
#define DEFAULTCONTEXT "default"
#define DEFAULTCALLERID "Unknown"
@@ -5563,6 +5563,8 @@ static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state
return NULL;
}
+ ast_channel_stage_snapshot(tmp);
+
ast_format_cap_copy(ast_channel_nativeformats(tmp), l->cap);
if (ast_format_cap_is_empty(ast_channel_nativeformats(tmp))) {
ast_format_cap_copy(ast_channel_nativeformats(tmp), global_cap);
@@ -5623,6 +5625,9 @@ static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state
}
}
ast_channel_priority_set(tmp, 1);
+
+ ast_channel_stage_snapshot_done(tmp);
+
if (state != AST_STATE_DOWN) {
if (unistimdebug) {
ast_verb(0, "Starting pbx in unistim_new\n");
diff --git a/channels/sig_pri.c b/channels/sig_pri.c
index 9f4007723..5def34c23 100644
--- a/channels/sig_pri.c
+++ b/channels/sig_pri.c
@@ -6473,6 +6473,7 @@ static void *pri_dchannel(void *vpri)
ast_mutex_lock(&pri->lock);
sig_pri_lock_private(pri->pvts[chanpos]);
if (c) {
+ ast_channel_stage_snapshot(c);
#if defined(HAVE_PRI_SUBADDR)
if (e->ring.calling.subaddress.valid) {
/* Set Calling Subaddress */
@@ -6557,6 +6558,7 @@ static void *pri_dchannel(void *vpri)
PVT_TO_CHANNEL(pri->pvts[chanpos]), 1);
#endif
}
+ ast_channel_stage_snapshot_done(c);
}
if (c && !ast_pthread_create_detached(&threadid, NULL, pri_ss_thread, pri->pvts[chanpos])) {
ast_verb(3, "Accepting overlap call from '%s' to '%s' on channel %d/%d, span %d\n",
@@ -6602,6 +6604,7 @@ static void *pri_dchannel(void *vpri)
* will do anything with the channel we have just
* created.
*/
+ ast_channel_stage_snapshot(c);
#if defined(HAVE_PRI_SUBADDR)
if (e->ring.calling.subaddress.valid) {
/* Set Calling Subaddress */
@@ -6670,6 +6673,8 @@ static void *pri_dchannel(void *vpri)
sig_pri_handle_subcmds(pri, chanpos, e->e, e->ring.subcmds,
e->ring.call);
+
+ ast_channel_stage_snapshot_done(c);
}
if (c && !ast_pbx_start(c)) {
ast_verb(3, "Accepting call from '%s' to '%s' on channel %d/%d, span %d\n",
diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c
index e6e11bed6..166fda2f7 100644
--- a/channels/sig_ss7.c
+++ b/channels/sig_ss7.c
@@ -621,6 +621,8 @@ static void ss7_start_call(struct sig_ss7_chan *p, struct sig_ss7_linkset *links
sig_ss7_set_echocanceller(p, 1);
+ ast_channel_stage_snapshot(c);
+
/*
* It is reasonably safe to set the following
* channel variables while the channel private
@@ -700,6 +702,8 @@ static void ss7_start_call(struct sig_ss7_chan *p, struct sig_ss7_linkset *links
p->generic_name[0] = 0;
}
+ ast_channel_stage_snapshot_done(c);
+
sig_ss7_unlock_private(p);
ast_channel_unlock(c);