[asterisk-commits] trunk r33842 - in /trunk: ./ apps/app_mixmonitor.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Tue Jun 13 06:40:59 MST 2006


Author: kpfleming
Date: Tue Jun 13 08:40:58 2006
New Revision: 33842

URL: http://svn.digium.com/view/asterisk?rev=33842&view=rev
Log:
Merged revisions 33841 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r33841 | kpfleming | 2006-06-13 08:30:06 -0500 (Tue, 13 Jun 2006) | 2 lines

memory allocation optimizations

........

Modified:
    trunk/   (props changed)
    trunk/apps/app_mixmonitor.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.

Modified: trunk/apps/app_mixmonitor.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_mixmonitor.c?rev=33842&r1=33841&r2=33842&view=diff
==============================================================================
--- trunk/apps/app_mixmonitor.c (original)
+++ trunk/apps/app_mixmonitor.c Tue Jun 13 08:40:58 2006
@@ -92,7 +92,7 @@
 static const char *mixmonitor_spy_type = "MixMonitor";
 
 struct mixmonitor {
-	struct ast_channel_spy *spy;
+	struct ast_channel_spy spy;
 	struct ast_filestream *fs;
 	char *post_process;
 	char *name;
@@ -135,7 +135,7 @@
 		return;
 
 	ast_channel_lock(chan);
-	ast_channel_spy_remove(spy->chan, spy);
+	ast_channel_spy_remove(chan, spy);
 	ast_channel_unlock(chan);
 }
 
@@ -169,24 +169,24 @@
 	if (option_verbose > 1)
 		ast_verbose(VERBOSE_PREFIX_2 "Begin MixMonitor Recording %s\n", mixmonitor->name);
 	
-	ast_mutex_lock(&mixmonitor->spy->lock);
-
-	while (mixmonitor->spy->chan) {
-		struct ast_frame *next = NULL;
+	ast_mutex_lock(&mixmonitor->spy.lock);
+
+	while (mixmonitor->spy.chan) {
+		struct ast_frame *next;
 		int write;
 
-		ast_channel_spy_trigger_wait(mixmonitor->spy);
+		ast_channel_spy_trigger_wait(&mixmonitor->spy);
 		
-		if (!mixmonitor->spy->chan || mixmonitor->spy->status != CHANSPY_RUNNING) {
+		if (!mixmonitor->spy.chan || mixmonitor->spy.status != CHANSPY_RUNNING) {
 			break;
 		}
 		
 		while (1) {
-			if (!(f = ast_channel_spy_read_frame(mixmonitor->spy, SAMPLES_PER_FRAME)))
+			if (!(f = ast_channel_spy_read_frame(&mixmonitor->spy, SAMPLES_PER_FRAME)))
 				break;
 
 			write = (!ast_test_flag(mixmonitor, MUXFLAG_BRIDGED) ||
-				 ast_bridged_channel(mixmonitor->spy->chan));
+				 ast_bridged_channel(mixmonitor->spy.chan));
 
 			/* it is possible for ast_channel_spy_read_frame() to return a chain
 			   of frames if a queue flush was necessary, so process them
@@ -200,27 +200,23 @@
 		}
 	}
 
-	ast_mutex_unlock(&mixmonitor->spy->lock);
-	
-	stopmon(mixmonitor->spy);
+	ast_mutex_unlock(&mixmonitor->spy.lock);
+	
+	stopmon(&mixmonitor->spy);
 
 	if (option_verbose > 1)
 		ast_verbose(VERBOSE_PREFIX_2 "End MixMonitor Recording %s\n", mixmonitor->name);
 
-	if (!ast_strlen_zero(mixmonitor->post_process)) {
+	if (mixmonitor->post_process) {
 		if (option_verbose > 2)
 			ast_verbose(VERBOSE_PREFIX_2 "Executing [%s]\n", mixmonitor->post_process);
 		ast_safe_system(mixmonitor->post_process);
 	}
 
-	ast_mutex_destroy(&mixmonitor->spy->lock);
+	ast_mutex_destroy(&mixmonitor->spy.lock);
 		
 	ast_closestream(mixmonitor->fs);
 
-	/* Deallocate everything */
-	free(mixmonitor->spy);
-	free(mixmonitor->post_process);
-	free(mixmonitor->name);
 	free(mixmonitor);
 
 	ast_atomic_fetchadd_int(&__mod_desc->usecnt, -1);
@@ -234,23 +230,42 @@
 	pthread_attr_t attr;
 	pthread_t thread;
 	struct mixmonitor *mixmonitor;
-	char *file_name, *postprocess, *ext, postprocess2[1024] = "";
+	char *file_name, *ext;
+	char postprocess2[1024] = "";
 	unsigned int oflags;
-
-	if (!(mixmonitor = ast_calloc(1, sizeof(*mixmonitor)))) {
-		ast_log(LOG_ERROR, "Memory Error!\n");
+	size_t len;
+
+	len = sizeof(*mixmonitor) + strlen(chan->name) + 1;
+
+	/* If a post process system command is given attach it to the structure */
+	if (!ast_strlen_zero(post_process)) {
+		char *p1, *p2;
+
+		p1 = ast_strdupa(post_process);
+		for (p2 = p1; *p2 ; p2++) {
+			if (*p2 == '^' && *(p2+1) == '{') {
+				*p2 = '$';
+			}
+		}
+
+		pbx_substitute_variables_helper(chan, p1, postprocess2, sizeof(postprocess2) - 1);
+		if (!ast_strlen_zero(postprocess2))
+			len += strlen(postprocess2) + 1;
+	}
+
+	/* Pre-allocate mixmonitor structure and spy */
+	if (!(mixmonitor = calloc(1, len))) {
 		return;
 	}
-
-	if (!(mixmonitor->spy = ast_calloc(1, sizeof(*mixmonitor->spy)))) {
-                ast_log(LOG_ERROR, "Memory Error!\n");
-		free(mixmonitor);
-                return;
-        }
 
 	/* Copy over flags and channel name */
 	mixmonitor->flags = flags;
-	mixmonitor->name = ast_strdup(chan->name);
+	mixmonitor->name = (char *) mixmonitor + sizeof(*mixmonitor);
+	strcpy(mixmonitor->name, chan->name);
+	if (!ast_strlen_zero(postprocess2)) {
+		mixmonitor->post_process = mixmonitor->name + strlen(mixmonitor->name) + 1;
+		strcpy(mixmonitor->post_process, postprocess2);
+	}
 
 	/* Determine creation flags and filename plus extension for filestream */
 	oflags = O_CREAT | O_WRONLY;
@@ -266,51 +281,33 @@
 	mixmonitor->fs = ast_writefile(file_name, ext, NULL, oflags, 0, 0644);
 	if (!mixmonitor->fs) {
 		ast_log(LOG_ERROR, "Cannot open %s.%s\n", file_name, ext);
-		free(mixmonitor->name);
-		free(mixmonitor->spy);
 		free(mixmonitor);
 		return;
 	}
 
-	/* If a post process system command is given attach it to the structure */
-	if (!ast_strlen_zero(post_process)) {
-		char *p = NULL;
-		postprocess = ast_strdupa(post_process);
-		for (p = postprocess; *p ; p++) {
-			if (*p == '^' && *(p+1) == '{') {
-				*p = '$';
-			}
-		}
-		pbx_substitute_variables_helper(chan, postprocess, postprocess2, sizeof(postprocess2) - 1);
-		mixmonitor->post_process = strdup(postprocess2);
-	}
-
 	/* Setup the actual spy before creating our thread */
-	ast_set_flag(mixmonitor->spy, CHANSPY_FORMAT_AUDIO);
-	ast_set_flag(mixmonitor->spy, CHANSPY_MIXAUDIO);
-	mixmonitor->spy->type = mixmonitor_spy_type;
-	mixmonitor->spy->status = CHANSPY_RUNNING;
-	mixmonitor->spy->read_queue.format = AST_FORMAT_SLINEAR;
-	mixmonitor->spy->write_queue.format = AST_FORMAT_SLINEAR;
+	ast_set_flag(&mixmonitor->spy, CHANSPY_FORMAT_AUDIO);
+	ast_set_flag(&mixmonitor->spy, CHANSPY_MIXAUDIO);
+	mixmonitor->spy.type = mixmonitor_spy_type;
+	mixmonitor->spy.status = CHANSPY_RUNNING;
+	mixmonitor->spy.read_queue.format = AST_FORMAT_SLINEAR;
+	mixmonitor->spy.write_queue.format = AST_FORMAT_SLINEAR;
 	if (readvol) {
-		ast_set_flag(mixmonitor->spy, CHANSPY_READ_VOLADJUST);
-		mixmonitor->spy->read_vol_adjustment = readvol;
+		ast_set_flag(&mixmonitor->spy, CHANSPY_READ_VOLADJUST);
+		mixmonitor->spy.read_vol_adjustment = readvol;
 	}
 	if (writevol) {
-		ast_set_flag(mixmonitor->spy, CHANSPY_WRITE_VOLADJUST);
-		mixmonitor->spy->write_vol_adjustment = writevol;
-	}
-	ast_mutex_init(&mixmonitor->spy->lock);
-
-	if (startmon(chan, mixmonitor->spy)) {
+		ast_set_flag(&mixmonitor->spy, CHANSPY_WRITE_VOLADJUST);
+		mixmonitor->spy.write_vol_adjustment = writevol;
+	}
+	ast_mutex_init(&mixmonitor->spy.lock);
+
+	if (startmon(chan, &mixmonitor->spy)) {
 		ast_log(LOG_WARNING, "Unable to add '%s' spy to channel '%s'\n",
-			mixmonitor->spy->type, chan->name);
+			mixmonitor->spy.type, chan->name);
 		/* Since we couldn't add ourselves - bail out! */
-		ast_mutex_destroy(&mixmonitor->spy->lock);
-		free(mixmonitor->post_process);
+		ast_mutex_destroy(&mixmonitor->spy.lock);
 		ast_closestream(mixmonitor->fs);
-		free(mixmonitor->name);
-		free(mixmonitor->spy);
 		free(mixmonitor);
 		return;
 	}



More information about the asterisk-commits mailing list