[svn-commits] rizzo: branch rizzo/astobj2 r47400 - /team/rizzo/astobj2/channels/chan_sip.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Thu Nov 9 15:48:49 MST 2006


Author: rizzo
Date: Thu Nov  9 16:48:48 2006
New Revision: 47400

URL: http://svn.digium.com/view/asterisk?view=rev&rev=47400
Log:
rename a couple of fields to help fixing more reference handling with pvt.

For the time being, in same places I have put pvt_unref()
but i believe i should put sip_destroy() instead.

The places marked XXX need to be checked in trunk as well,
because i suspect pvt's (from peer->call and peer->mwipvt)
are just unreferenced but not destroyed when they should.

This would explain why, when pointing "sipp" at asterisk
with high load of calls, a lot of entries seem to remain
in "sip show channels" without expiring even after
sipp is stopped.

trunk candidate. 1.4 as well, i suspect.


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=47400&r1=47399&r2=47400
==============================================================================
--- team/rizzo/astobj2/channels/chan_sip.c (original)
+++ team/rizzo/astobj2/channels/chan_sip.c Thu Nov  9 16:48:48 2006
@@ -1042,7 +1042,10 @@
 #define FLAG_RESPONSE (1 << 0)
 #define FLAG_FATAL (1 << 1)
 
-/*! \brief sip packet - raw format for outbound packets that are sent or scheduled for transmission */
+/*! \brief sip packet - raw format for outbound packets that are sent or scheduled for transmission
+ * Packets are linked in a list, whose head is in the sip_pvt they belong to.
+ * Each packet holds a reference to the parent sip_pvt
+ */
 struct sip_pkt {
 	struct sip_pkt *next;			/*!< Next packet in linked list */
 	int retrans;				/*!< Retransmission number */
@@ -1144,14 +1147,14 @@
 	struct sockaddr_in addr;	/*!<  IP address of peer */
 	
 	/* Qualification */
-	struct sip_pvt *call;		/*!<  Call pointer */
+	struct sip_pvt *peer_call;		/*!<  Call pointer */
 	int pokeexpire;			/*!<  When to expire poke (qualify= checking) */
 	int lastms;			/*!<  How long last response took (in ms), or -1 for no response */
 	int maxms;			/*!<  Max ms we will accept for the host to be up, 0 to not monitor */
 	struct timeval ps;		/*!<  Ping send time */
 	
 	struct sockaddr_in defaddr;	/*!<  Default IP address, used until registration */
-	struct sip_pvt *mwipvt;		/*!<  Subscription for MWI */
+	struct sip_pvt *mwi_pvt;		/*!<  Subscription for MWI */
 	int lastmsg;
 };
 
@@ -2530,11 +2533,11 @@
 		ast_log(LOG_DEBUG, "Destroying SIP peer %s\n", peer->name);
 
 	/* Delete it, it needs to disappear */
-	if (peer->call)
-		sip_destroy(peer->call);
-
-	if (peer->mwipvt) 	/* We have an active subscription, delete it */
-		sip_destroy(peer->mwipvt);
+	if (peer->peer_call)
+		sip_destroy(peer->peer_call);
+
+	if (peer->mwi_pvt) 	/* We have an active subscription, delete it */
+		sip_destroy(peer->mwi_pvt);
 
 	if (peer->chanvars) {
 		ast_variables_destroy(peer->chanvars);
@@ -3077,8 +3080,8 @@
 		ast_verbose("Really destroying SIP dialog '%s' Method: %s\n", p->callid, sip_methods[p->method].text);
 
 	/* Remove link from peer to subscription of MWI */
-	if (p->relatedpeer && p->relatedpeer->mwipvt) 
-		p->relatedpeer->mwipvt = NULL;
+	if (p->relatedpeer && p->relatedpeer->mwi_pvt) /* XXX sip_destroy ? */
+		p->relatedpeer->mwi_pvt = pvt_unref(p->relatedpeer->mwi_pvt);
 
 	if (dumphistory)
 		sip_dump_history(p);
@@ -12331,7 +12334,9 @@
 		|| was_reachable != is_reachable;
 
 	peer->lastms = pingtime;
-	peer->call = NULL;
+	/* XXX do we need to unlink too ? */
+	if (peer->peer_call)
+		peer->peer_call = pvt_unref(peer->peer_call);
 	if (statechanged) {
 		const char *s = is_reachable ? "Reachable" : "Lagged";
 
@@ -14560,10 +14565,10 @@
 		}
 
 		p->subscribed = MWI_NOTIFICATION;
-		if (authpeer->mwipvt && authpeer->mwipvt != p)	/* Destroy old PVT if this is a new one */
+		if (authpeer->mwi_pvt && authpeer->mwi_pvt != p)	/* Destroy old PVT if this is a new one */
 			/* We only allow one subscription per peer */
-			sip_destroy(authpeer->mwipvt);
-		authpeer->mwipvt = p;		/* Link from peer to pvt */
+			sip_destroy(authpeer->mwi_pvt);
+		authpeer->mwi_pvt = p;		/* Link from peer to pvt */
 		p->relatedpeer = authpeer;	/* Link from pvt to peer */
 		/* Do not release authpeer here */
 	} else { /* At this point, Asterisk does not understand the specified event */
@@ -15054,9 +15059,9 @@
 	
 	peer->lastmsgssent = ((newmsgs << 8) | (oldmsgs));
 
-	if (peer->mwipvt) {
+	if (peer->mwi_pvt) {
 		/* Base message on subscription */
-		p = peer->mwipvt;
+		p = pvt_ref(peer->mwi_pvt);
 	} else {
 		/* Build temporary dialog for this message */
 		if (!(p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY))) 
@@ -15077,6 +15082,7 @@
 	/* Send MWI */
 	ast_set_flag(&p->flags[0], SIP_OUTGOING);
 	transmit_notify_with_mwi(p, newmsgs, oldmsgs, peer->vmexten);
+	pvt_unref(p);
 	return 0;
 }
 
@@ -15086,7 +15092,7 @@
 	time_t t = time(NULL);
 
 	if (ast_test_flag(&peer->flags[1], SIP_PAGE2_SUBSCRIBEMWIONLY) &&
-	    !peer->mwipvt) {	/* We don't have a subscription */
+	    !peer->mwi_pvt) {	/* We don't have a subscription */
 		peer->lastmsgcheck = t;	/* Reset timer */
 		return FALSE;
 	}
@@ -15314,9 +15320,9 @@
 		ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE!  Last qualify: %d\n", peer->name, peer->lastms);
 		manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "Peer: SIP/%s\r\nPeerStatus: Unreachable\r\nTime: %d\r\n", peer->name, -1);
 	}
-	if (peer->call)
-		sip_destroy(peer->call);
-	peer->call = NULL;
+	if (peer->peer_call)
+		sip_destroy(peer->peer_call);
+	peer->peer_call = NULL;
 	peer->lastms = -1;
 	ast_device_state_changed("SIP/%s", peer->name);
 	/* Try again quickly */
@@ -15338,15 +15344,16 @@
 			ast_sched_del(sched, peer->pokeexpire);
 		peer->lastms = 0;
 		peer->pokeexpire = -1;
-		peer->call = NULL;
+		if (peer->peer_call)	/* XXX or sip_destroy() ? */
+			peer->peer_call = pvt_unref(peer->peer_call);
 		return 0;
 	}
-	if (peer->call) {
+	if (peer->peer_call) {
 		if (sipdebug)
 			ast_log(LOG_NOTICE, "Still have a QUALIFY dialog active, deleting\n");
-		sip_destroy(peer->call);
-	}
-	if (!(p = peer->call = sip_alloc(NULL, NULL, 0, SIP_OPTIONS)))
+		sip_destroy(peer->peer_call);
+	}
+	if (!(p = peer->peer_call = sip_alloc(NULL, NULL, 0, SIP_OPTIONS)))
 		return -1;
 	
 	p->sa = peer->addr;



More information about the svn-commits mailing list