[svn-commits] mmichelson: branch group/CCSS r251733 - in /team/group/CCSS: channels/ channe...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Mar 10 16:39:05 CST 2010
Author: mmichelson
Date: Wed Mar 10 16:39:01 2010
New Revision: 251733
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=251733
Log:
A couple of bug fixes/improvements.
Bug fixes:
* Make the agent unref the final operation of offer_timer_expire. That way if it happens
to be that we destroy it there, we don't immediately attempt to reference one of its
fields afterwards.
* Be sure to set p->lastinvite when we send a SIP_SUBSCRIBE. Otherwise, when we receive
a NOTIFY, we'll attempt to destroy the pvt. This is not a huge problem since the
SIP monitor has a reference to the SUBSCRIBE pvt, but this still is not ideal behavior.
* Change the sip_cc_agent_pvt to not keep a reference to the original call. Instead, we
just make copies of the (very few) portions of the sip_pvt we actually need. This way
we don't potentially tie up a sip_pvt long after the call is over. Cool.
Modified:
team/group/CCSS/channels/chan_sip.c
team/group/CCSS/channels/sip/include/sip.h
team/group/CCSS/main/ccss.c
Modified: team/group/CCSS/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/channels/chan_sip.c?view=diff&rev=251733&r1=251732&r2=251733
==============================================================================
--- team/group/CCSS/channels/chan_sip.c (original)
+++ team/group/CCSS/channels/chan_sip.c Wed Mar 10 16:39:01 2010
@@ -1682,18 +1682,18 @@
return agent;
}
-static int find_by_call_pvt_helper(void *obj, void *arg, int flags)
+static int find_by_callid_helper(void *obj, void *arg, int flags)
{
struct ast_cc_agent *agent = obj;
struct sip_cc_agent_pvt *agent_pvt = agent->private_data;
struct sip_pvt *call_pvt = arg;
- return agent_pvt->original_call == call_pvt ? CMP_MATCH | CMP_STOP : 0;
-}
-
-static struct ast_cc_agent *find_sip_cc_agent_by_call_pvt(struct sip_pvt *pvt)
-{
- struct ast_cc_agent *agent = ast_cc_agent_callback(0, find_by_call_pvt_helper, pvt, "SIP");
+ return !strcmp(agent_pvt->original_callid, call_pvt->callid) ? CMP_MATCH | CMP_STOP : 0;
+}
+
+static struct ast_cc_agent *find_sip_cc_agent_by_original_callid(struct sip_pvt *pvt)
+{
+ struct ast_cc_agent *agent = ast_cc_agent_callback(0, find_by_callid_helper, pvt, "SIP");
return agent;
}
@@ -1708,12 +1708,13 @@
ast_assert(!strcmp(chan->tech->type, "SIP"));
- agent_pvt->original_call = dialog_ref(call_pvt, "Get reference to original call dialog");
+ ast_copy_string(agent_pvt->original_callid, call_pvt->callid, sizeof(agent_pvt->original_callid));
+ ast_copy_string(agent_pvt->original_exten, call_pvt->exten, sizeof(agent_pvt->original_exten));
agent_pvt->offer_timer_id = -1;
agent->private_data = agent_pvt;
- sip_pvt_lock(agent_pvt->original_call);
- ast_set_flag(&agent_pvt->original_call->flags[0], SIP_OFFER_CC);
- sip_pvt_unlock(agent_pvt->original_call);
+ sip_pvt_lock(call_pvt);
+ ast_set_flag(&call_pvt->flags[0], SIP_OFFER_CC);
+ sip_pvt_unlock(call_pvt);
return 0;
}
@@ -1801,7 +1802,6 @@
}
sip_cc_agent_stop_offer_timer(agent);
- agent_pvt->original_call = dialog_unref(agent_pvt->original_call, "SIP CC agent destructor: Remove ref to original call");
if (agent_pvt->subscribe_pvt) {
sip_pvt_lock(agent_pvt->subscribe_pvt);
if (!ast_test_flag(&agent_pvt->subscribe_pvt->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED)) {
@@ -10137,7 +10137,7 @@
{
char uri[SIPBUFSIZE];
struct ast_str *header = ast_str_alloca(SIPBUFSIZE);
- struct ast_cc_agent *agent = find_sip_cc_agent_by_call_pvt(p);
+ struct ast_cc_agent *agent = find_sip_cc_agent_by_original_callid(p);
struct sip_cc_agent_pvt *agent_pvt;
if (!agent) {
@@ -10736,7 +10736,7 @@
if (!p->initreq.headers || init > 2)
initialize_initreq(p, &req);
- if (sipmethod == SIP_INVITE) {
+ if (sipmethod == SIP_INVITE || sipmethod == SIP_SUBSCRIBE) {
p->lastinvite = p->ocseq;
}
return send_request(p, &req, init ? XMIT_CRITICAL : XMIT_RELIABLE, p->ocseq);
@@ -13463,7 +13463,7 @@
/* This is a CC recall. We can set p's extension to the exten from
* the original INVITE
*/
- ast_string_field_set(p, exten, agent_pvt->original_call->exten);
+ ast_string_field_set(p, exten, agent_pvt->original_exten);
/* And we need to let the CC core know that the caller is attempting
* his recall
*/
Modified: team/group/CCSS/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/channels/sip/include/sip.h?view=diff&rev=251733&r1=251732&r2=251733
==============================================================================
--- team/group/CCSS/channels/sip/include/sip.h (original)
+++ team/group/CCSS/channels/sip/include/sip.h Wed Mar 10 16:39:01 2010
@@ -1599,10 +1599,18 @@
struct sip_cc_agent_pvt {
int offer_timer_id;
- /* A reference to the dialog with the caller
- * who is failing to reach his intended destination.
- */
- struct sip_pvt *original_call;
+ /* A copy of the original call's Call-ID.
+ * We use this as a search key when attempting
+ * to find a particular sip_pvt.
+ */
+ char original_callid[SIPBUFSIZE];
+ /* A copy of the exten called originally.
+ * We use this to set the proper extension
+ * to dial during the recall since the incoming
+ * request URI is one that was generated just
+ * for the recall
+ */
+ char original_exten[SIPBUFSIZE];
/* A reference to the dialog which we will
* be sending a NOTIFY on when it comes time
* to send one
Modified: team/group/CCSS/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=251733&r1=251732&r2=251733
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Wed Mar 10 16:39:01 2010
@@ -2314,8 +2314,8 @@
ast_log_dynamic_level(cc_logger_level, "Core %d: Queuing change request because offer timer has expired.\n",
agent->core_id);
agent_pvt->offer_timer_id = -1;
+ ast_cc_failed(agent->core_id, "Generic agent %s offer timer expired", agent->device_name);
cc_unref((struct ast_cc_agent *)agent, "Remove scheduler's reference to the agent");
- ast_cc_failed(agent->core_id, "Generic agent %s offer timer expired", agent->device_name);
return 0;
}
More information about the svn-commits
mailing list