[svn-commits] murf: branch murf/bug11210 r103333 - in /team/murf/bug11210: channels/ main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Feb 11 23:35:06 CST 2008


Author: murf
Date: Mon Feb 11 23:35:05 2008
New Revision: 103333

URL: http://svn.digium.com/view/asterisk?view=rev&rev=103333
Log:
Another checkpoint; I only have one dialog in this test scenario that isn't destroyed after a 'stop gracefully', and a series of 'Unable to cancel schedule ID XXXX' messages, which need to be sorted out.

Modified:
    team/murf/bug11210/channels/chan_sip.c
    team/murf/bug11210/main/astobj2.c

Modified: team/murf/bug11210/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/murf/bug11210/channels/chan_sip.c?view=diff&rev=103333&r1=103332&r2=103333
==============================================================================
--- team/murf/bug11210/channels/chan_sip.c (original)
+++ team/murf/bug11210/channels/chan_sip.c Mon Feb 11 23:35:05 2008
@@ -2392,9 +2392,9 @@
  */
 static void *dialog_unlink_all(struct sip_pvt *dialog, int lockowner, int lockdialoglist)
 {
+	dialog_ref(dialog, "Let's bump the count in the unlink so it doesn't accidentally become dead before we are done");
+
 	ao2_t_unlink(dialogs, dialog, "unlinking dialog via ao2_unlink");
-
-	dialog_ref(dialog, "Let's bump the count in the unlink so it doesn't accidentally become dead before we are done");
 
 	/* Unlink us from the owner (channel) if we have one */
 	if (dialog->owner) {
@@ -2420,10 +2420,11 @@
 
 	AST_SCHED_DEL_UNREF(sched, dialog->initid, dialog_unref(dialog, "when you delete the initid sched, you should dec the refcount for the stored dialog ptr"));
 	
-	AST_SCHED_DEL_UNREF(sched, dialog->autokillid, dialog_unref(dialog, "when you delete the autokillid sched, you should dec the refcount for the stored dialog ptr"));
+	if (dialog->autokillid != -1)
+		AST_SCHED_DEL_UNREF(sched, dialog->autokillid, dialog_unref(dialog, "when you delete the autokillid sched, you should dec the refcount for the stored dialog ptr"));
 
 	dialog_unref(dialog, "Let's unbump the count in the unlink so the poor pvt can disappear if it is time");
-	dialog_unref(dialog, "One final decrement to counter the creation of the dialog and allow its destruction");
+	/* dialog_unref(dialog, "One final decrement to counter the creation of the dialog and allow its destruction"); this is just plain wrong. any scenario that requires this is just WRONG. */
 	return NULL;
 }
 
@@ -3033,16 +3034,14 @@
 		if (p->relatedpeer)
 			p->relatedpeer = unref_peer(p->relatedpeer, "__sip_autodestruct: unref peer p->relatedpeer");	/* Remove link to peer. If it's realtime, make sure it's gone from memory) */
 
+	/* sometimes, the unref from deleting the autokillid sched item, will
+	   free the dialog; we need to hang on a little longer and make sure it's cleaned out first */
+	dialog_ref(p, "Bump counter in autodestruct to prevent premature destructio of dialog");
 	/* Reset schedule ID */
 	if (p->autokillid != -1) {
-		int res3;
-		res3 = ast_sched_del(sched, p->autokillid);
+		AST_SCHED_DEL_UNREF(sched, p->autokillid, dialog_unref(p,"dialog unrefd because autokillid sched is being deleted"));
 		append_history(p, "CancelDestroy", "");
-		p->autokillid = -1;
-		if (!res3)
-			dialog_unref(p, "dialog unrefd because autokillid sched is being deleted");
-	}
-	
+	}
 
 	if (p->owner) {
 		ast_log(LOG_WARNING, "Autodestruct on dialog '%s' with owner in place (Method: %s)\n", p->callid, sip_methods[p->method].text);
@@ -3062,6 +3061,7 @@
 		/* sip_destroy(p); */		/* Go ahead and destroy dialog. All attempts to recover is done */
 		/* sip_destroy also absorbs the reference */
 	}
+	dialog_unref(p, "UNBump counter in autodestruct to ALLOW  destructio of dialog");
 	return 0;
 }
 
@@ -9238,6 +9238,7 @@
 			ast_log(LOG_WARNING, "Unable to allocate registration transaction (memory or socket error)\n");
 			return 0;
 		}
+		ast_log(LOG_NOTICE,"Allocated SIP pvt dialog %p in transmit_register!\n", p);
 		
 		if (p->do_history)
 			append_history(p, "RegistryInit", "Account: %s@%s", r->username, r->hostname);
@@ -9249,7 +9250,7 @@
 			/* we have what we hope is a temporary network error,
 			 * probably DNS.  We need to reschedule a registration try */
 			dialog_unlink_all(p, TRUE, TRUE);
-			p = dialog_unref(p, "unref dialog after unlink_all");
+			p = dialog_unref(p, "unref dialog after unlink_all"); /* HUH? this might be bad! */
 			if (r->timeout > -1) {
 				AST_SCHED_REPLACE(r->timeout, sched, global_reg_timeout * 1000, sip_reg_timeout, r);
 				ast_log(LOG_WARNING, "Still have a registration timeout for %s@%s (create_addr() error), %d\n", r->username, r->hostname, r->timeout);
@@ -9264,7 +9265,7 @@
 		ast_string_field_set(r, callid, p->callid);
 		if (r->portno) {
 			p->sa.sin_port = htons(r->portno);
-			p->recv.sin_port = htons(r->portno);
+ 			p->recv.sin_port = htons(r->portno);
 		} 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 */
@@ -12325,7 +12326,7 @@
 	   - if that's the case, wait with destruction */
 	if (dialog->needdestroy && !dialog->packets && !dialog->owner) {
 		sip_pvt_unlock(dialog);
-		dialog_unref(dialog, "needdestroy: one more refcount decrement to allow dialog to be destroyed");
+		/* no, the unlink should handle this: dialog_unref(dialog, "needdestroy: one more refcount decrement to allow dialog to be destroyed"); */
 		/* the CMP_MATCH will unlink this dialog from the dialog hash table */
 		return CMP_MATCH;
 	}
@@ -18587,6 +18588,7 @@
 	ast_set_flag(&p->flags[0], SIP_OUTGOING);
 	/* the following will decrement the refcount on p as it finishes */
 	transmit_notify_with_mwi(p, newmsgs, oldmsgs, peer->vmexten);
+	dialog_unref(p, "unref dialog ptr p just before it goes out of scope at the end of sip_send_mwi_to_peer.");
 	return 0;
 }
 
@@ -19180,7 +19182,7 @@
 		AST_SCHED_REPLACE(peer->pokeexpire, sched, 
 			peer->maxms * 2, sip_poke_noanswer, peer);
 	}
-
+	dialog_unref(p, "unref dialog at end of sip_poke_peer, obtained from sip_alloc, just before it goes out of scope");
 	return 0;
 }
 

Modified: team/murf/bug11210/main/astobj2.c
URL: http://svn.digium.com/view/asterisk/team/murf/bug11210/main/astobj2.c?view=diff&rev=103333&r1=103332&r2=103333
==============================================================================
--- team/murf/bug11210/main/astobj2.c (original)
+++ team/murf/bug11210/main/astobj2.c Mon Feb 11 23:35:05 2008
@@ -169,16 +169,16 @@
 	int ret;
 	struct astobj2 *obj = INTERNAL_OBJ(user_data);
 	
+	if (obj == NULL)
+		return -1;
+
 	if (delta != 0) {
 		
 		FILE *refo = fopen(REF_FILE,"a");
-		fprintf(refo, "%p %s%d   %s:%d:%s (%s)\n", user_data, (delta<0? "":"+"), delta, file, line, funcname, tag);
+		fprintf(refo, "%p %s%d   %s:%d:%s (%s) [@%d]\n", user_data, (delta<0? "":"+"), delta, file, line, funcname, tag, obj->priv_data.ref_counter);
 		fclose(refo);
 	}
 	
-	if (obj == NULL)
-		return -1;
-
 	/* if delta is 0, just return the refcount */
 	if (delta == 0)
 		return (obj->priv_data.ref_counter);
@@ -193,9 +193,9 @@
 
 	/* this case must never happen */
 	if (current_value < 0)
-		ast_log(LOG_ERROR, "refcount %d on object %p\n", current_value, user_data);
-
-	if (current_value <= 0) { /* last reference, destroy the object */
+		ast_log(LOG_ERROR, "refcount %d on object %p -- fix your code!\n", current_value, user_data);
+
+	if (current_value == 0) { /* last reference, destroy the object */
 		if (obj->priv_data.destructor_fn != NULL) {
 			FILE *refo = fopen(REF_FILE,"a");
 			fprintf(refo, "%p **call destructor** %s:%d:%s (%s)\n", user_data, file, line, funcname, tag);
@@ -212,8 +212,11 @@
 		 * allocated. */
 		bzero(obj, sizeof(struct astobj2 *) + sizeof(void *) );
 		free(obj);
-	}
-
+	} else if (current_value < 0) {
+		FILE *refo = fopen(REF_FILE,"a");
+		fprintf(refo, "%p **Refcount 0 or less** [%d]  %s:%d:%s (%s)\n", user_data, current_value, file, line, funcname, tag);
+		fclose(refo);
+	}
 	return ret;
 }
 




More information about the svn-commits mailing list