[asterisk-commits] rizzo: branch rizzo/astobj2 r47363 -
/team/rizzo/astobj2/channels/chan_sip.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Thu Nov 9 08:14:02 MST 2006
Author: rizzo
Date: Thu Nov 9 09:14:02 2006
New Revision: 47363
URL: http://svn.digium.com/view/asterisk?view=rev&rev=47363
Log:
more playing with refcounts.
Modified:
team/rizzo/astobj2/channels/chan_sip.c
Modified: team/rizzo/astobj2/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/astobj2/channels/chan_sip.c?view=diff&rev=47363&r1=47362&r2=47363
==============================================================================
--- team/rizzo/astobj2/channels/chan_sip.c (original)
+++ team/rizzo/astobj2/channels/chan_sip.c Thu Nov 9 09:14:02 2006
@@ -1030,14 +1030,20 @@
}
#endif
-static void pvt_ref(struct sip_pvt *p)
+/*!
+ * when we create or delete references, make sure to use these
+ * functions so we keep track of the refcounts.
+ */
+static struct sip_pvt *pvt_ref(struct sip_pvt *p)
{
ao2_ref(p, 1);
-}
-
-static void pvt_unref(struct sip_pvt *p)
+ return p;
+}
+
+static struct sip_pvt *pvt_unref(struct sip_pvt *p)
{
ao2_ref(p, -1);
+ return NULL;
}
#define FLAG_RESPONSE (1 << 0)
@@ -2262,7 +2268,9 @@
return res;
}
-/*! \brief Send SIP Request to the other part of the dialogue */
+/*! \brief Send SIP Request to the other part of the dialogue
+ * Assumes that a reference to p exists in the caller.
+ */
static int send_request(struct sip_pvt *p, struct sip_request *req, enum xmittype reliable, int seqno)
{
int res;
@@ -4570,7 +4578,7 @@
/* Ok, we've created a dialog, let's go and process it */
sip_pvt_lock(p);
}
- return p;
+ return p; /* can be NULL */
} else if( sip_methods[intended_method].can_create == CAN_CREATE_DIALOG_UNSUPPORTED_METHOD) {
/* A method we do not support, let's take it on the volley */
transmit_response_using_temp(callid, sin, 1, intended_method, req, "501 Method Not Implemented");
@@ -7286,6 +7294,7 @@
char tmp[80];
char addr[80];
struct sip_pvt *p;
+ int ret;
/* exit if we are already in process with this registrar ?*/
if ( r == NULL || ((auth==NULL) && (r->regstate==REG_STATE_REGSENT || r->regstate==REG_STATE_AUTHSENT))) {
@@ -7298,7 +7307,7 @@
ast_log(LOG_WARNING, "Already have a REGISTER going on to %s@%s?? \n", r->username, r->hostname);
return 0;
} else {
- p = r->call;
+ p = pvt_ref(r->call); /* grab a reference */
make_our_tag(p->tag, sizeof(p->tag)); /* create a new local tag for every register attempt */
ast_string_field_free(p, theirtag); /* forget their old tag, so we don't match tags when getting response */
}
@@ -7319,7 +7328,7 @@
if (create_addr(p, r->hostname)) {
/* we have what we hope is a temporary network error,
* probably DNS. We need to reschedule a registration try */
- sip_destroy(p);
+ sip_destroy(p); /* and the reference goes */
if (r->timeout > -1) {
ast_sched_del(sched, r->timeout);
r->timeout = ast_sched_add(sched, global_reg_timeout*1000, sip_reg_timeout, r);
@@ -7338,7 +7347,7 @@
else /* Set registry port to the port set from the peer definition/srv or default */
r->portno = ntohs(p->sa.sin_port);
ast_set_flag(&p->flags[0], SIP_OUTGOING); /* Registration is outgoing call */
- r->call=p; /* Save pointer to SIP packet */
+ r->call = pvt_ref(p); /* Save pointer to SIP packet */
p->registry = ASTOBJ_REF(r); /* Add pointer to registry in packet */
if (!ast_strlen_zero(r->secret)) /* Secret (password) */
ast_string_field_set(p, peersecret, r->secret);
@@ -7454,7 +7463,9 @@
r->regattempts++; /* Another attempt */
if (option_debug > 3)
ast_verbose("REGISTER attempt %d to %s@%s\n", r->regattempts, r->username, r->hostname);
- return send_request(p, &req, XMIT_CRITICAL, p->ocseq);
+ ret = send_request(p, &req, XMIT_CRITICAL, p->ocseq);
+ pvt_unref(p);
+ return ret;
}
/*! \brief Transmit text with SIP MESSAGE method */
@@ -8718,6 +8729,7 @@
- Their tag is fromtag, our tag is to-tag
- This means that in some transactions, totag needs to be their tag :-)
depending upon the direction
+ Returns a reference, remember to release it when done XXX
*/
static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *totag, const char *fromtag)
{
More information about the asterisk-commits
mailing list