[asterisk-commits] russell: branch russell/chan_refcount r89944 - /team/russell/chan_refcount/apps/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Nov 27 18:43:36 CST 2007


Author: russell
Date: Tue Nov 27 18:43:35 2007
New Revision: 89944

URL: http://svn.digium.com/view/asterisk?view=rev&rev=89944
Log:
minimize the time the channel lock is held, and add a missing unref

Modified:
    team/russell/chan_refcount/apps/app_mixmonitor.c

Modified: team/russell/chan_refcount/apps/app_mixmonitor.c
URL: http://svn.digium.com/view/asterisk/team/russell/chan_refcount/apps/app_mixmonitor.c?view=diff&rev=89944&r1=89943&r2=89944
==============================================================================
--- team/russell/chan_refcount/apps/app_mixmonitor.c (original)
+++ team/russell/chan_refcount/apps/app_mixmonitor.c Tue Nov 27 18:43:35 2007
@@ -213,8 +213,13 @@
 	struct mixmonitor *mixmonitor;
 	char postprocess2[1024] = "";
 	size_t len;
-
-	len = sizeof(*mixmonitor) + strlen(chan->name) + strlen(filename) + 2;
+	const char *chan_name;
+
+	ast_channel_lock(chan);
+	chan_name = ast_strdupa(chan->name);
+	ast_channel_unlock(chan);
+
+	len = sizeof(*mixmonitor) + strlen(chan_name) + strlen(filename) + 2;
 
 	postprocess2[0] = 0;
 	/* If a post process system command is given attach it to the structure */
@@ -241,13 +246,13 @@
 	mixmonitor->flags = flags;
 	mixmonitor->chan = chan;
 	mixmonitor->name = (char *) mixmonitor + sizeof(*mixmonitor);
-	strcpy(mixmonitor->name, chan->name);
+	strcpy(mixmonitor->name, chan_name);
 	if (!ast_strlen_zero(postprocess2)) {
 		mixmonitor->post_process = mixmonitor->name + strlen(mixmonitor->name) + strlen(filename) + 2;
 		strcpy(mixmonitor->post_process, postprocess2);
 	}
 
-	mixmonitor->filename = (char *) mixmonitor + sizeof(*mixmonitor) + strlen(chan->name) + 1;
+	mixmonitor->filename = (char *) mixmonitor + sizeof(*mixmonitor) + strlen(chan_name) + 1;
 	strcpy(mixmonitor->filename, filename);
 
 	/* Setup the actual spy before creating our thread */
@@ -265,7 +270,7 @@
 
 	if (startmon(chan, &mixmonitor->audiohook)) {
 		ast_log(LOG_WARNING, "Unable to add '%s' spy to channel '%s'\n",
-			mixmonitor_spy_type, chan->name);
+			mixmonitor_spy_type, chan_name);
 		ast_audiohook_destroy(&mixmonitor->audiohook);
 		ast_free(mixmonitor);
 		return;
@@ -350,10 +355,8 @@
 		*slash = '\0';
 	ast_mkdir(tmp, 0777);
 
-	ast_channel_lock(chan);
 	pbx_builtin_setvar_helper(chan, "MIXMONITOR_FILENAME", args.filename);
 	launch_monitor_thread(chan, args.filename, flags.flags, readvol, writevol, args.post_process);
-	ast_channel_unlock(chan);
 
 	return 0;
 }
@@ -393,6 +396,8 @@
 	else
 		ast_audiohook_detach_source(chan, mixmonitor_spy_type);
 
+	ast_channel_unref(chan);
+
 	return CLI_SUCCESS;
 }
 




More information about the asterisk-commits mailing list