[asterisk-commits] russell: branch russell/ast_cli_tls r38087 - /team/russell/ast_cli_tls/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Fri Jul 21 21:43:32 MST 2006


Author: russell
Date: Fri Jul 21 23:43:32 2006
New Revision: 38087

URL: http://svn.digium.com/view/asterisk?rev=38087&view=rev
Log:
Change the implementation of ast_cli() to use thread local storage. Previously,
ast_cli() did a heap memory allocation and free every time the function was
called. The one limitation that this change introduces is that the resulting
string's length is limited to AST_CLI_STRLEN, which I currently have defined to
be 256 characters. I can't imagine that there are any cases where we would
really need more than that so I think this is an acceptable limitation, but I
am certainly open to feedback on it.

Modified:
    team/russell/ast_cli_tls/   (props changed)
    team/russell/ast_cli_tls/cli.c

Propchange: team/russell/ast_cli_tls/
------------------------------------------------------------------------------
    automerge = *

Propchange: team/russell/ast_cli_tls/
------------------------------------------------------------------------------
    automerge-email = russell at digium.com

Propchange: team/russell/ast_cli_tls/
------------------------------------------------------------------------------
    svnmerge-integrated = /trunk:1-38085

Modified: team/russell/ast_cli_tls/cli.c
URL: http://svn.digium.com/view/asterisk/team/russell/ast_cli_tls/cli.c?rev=38087&r1=38086&r2=38087&view=diff
==============================================================================
--- team/russell/ast_cli_tls/cli.c (original)
+++ team/russell/ast_cli_tls/cli.c Fri Jul 21 23:43:32 2006
@@ -50,22 +50,36 @@
 #include "editline/readline/readline.h"
 
 extern unsigned long global_fin, global_fout;
-	
+
+static pthread_key_t ast_cli_buf_key;
+static pthread_once_t ast_cli_buf_once = PTHREAD_ONCE_INIT;
+
+#define AST_CLI_MAXSTRLEN   256
+
+static void ast_cli_buf_key_create(void)
+{
+	pthread_key_create(&ast_cli_buf_key, free);
+}
+
 void ast_cli(int fd, char *fmt, ...)
 {
-	char *stuff;
+	char *buf;
 	int res;
 	va_list ap;
 
+	pthread_once(&ast_cli_buf_once, ast_cli_buf_key_create);
+	if (!(buf = pthread_getspecific(ast_cli_buf_key))) {
+		if (!(buf = ast_calloc(1, AST_CLI_MAXSTRLEN)))
+			return;
+		pthread_setspecific(ast_cli_buf_key, buf);
+	}
+
 	va_start(ap, fmt);
-	res = vasprintf(&stuff, fmt, ap);
+	res = vsnprintf(buf, AST_CLI_MAXSTRLEN, fmt, ap);
 	va_end(ap);
-	if (res == -1) {
-		ast_log(LOG_ERROR, "Memory allocation failure\n");
-	} else {
-		ast_carefulwrite(fd, stuff, strlen(stuff), 100);
-		free(stuff);
-	}
+
+	if (res > 0)
+		ast_carefulwrite(fd, buf, strlen(buf), 100);
 }
 
 static AST_LIST_HEAD_STATIC(helpers, ast_cli_entry);



More information about the asterisk-commits mailing list