summaryrefslogtreecommitdiffstats
path: root/lib/talloc/talloc.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2014-01-10 10:45:22 +0100
committerJeremy Allison <jra@samba.org>2014-05-15 12:49:14 +0200
commit593c8103af5a5ed6b3c915369fed5b90efb42c25 (patch)
tree2afeb44a5b029105d84b50c2a7711de6d8c7b80f /lib/talloc/talloc.c
parent5d998358e23ea572fa9c695ad953bab8ae49744c (diff)
downloadsamba-593c8103af5a5ed6b3c915369fed5b90efb42c25.tar.gz
samba-593c8103af5a5ed6b3c915369fed5b90efb42c25.tar.xz
samba-593c8103af5a5ed6b3c915369fed5b90efb42c25.zip
talloc: Tune talloc_vasprintf
vsnprintf is significantly more expensive than memcpy. For the common case where the string we print is less than a kilobyte, avoid the second vsnprintf. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Thu May 15 12:49:14 CEST 2014 on sn-devel-104
Diffstat (limited to 'lib/talloc/talloc.c')
-rw-r--r--lib/talloc/talloc.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/talloc/talloc.c b/lib/talloc/talloc.c
index 1cb4d7dead..2a5406e11d 100644
--- a/lib/talloc/talloc.c
+++ b/lib/talloc/talloc.c
@@ -2356,11 +2356,11 @@ _PUBLIC_ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap)
int len;
char *ret;
va_list ap2;
- char c;
+ char buf[1024];
/* this call looks strange, but it makes it work on older solaris boxes */
va_copy(ap2, ap);
- len = vsnprintf(&c, 1, fmt, ap2);
+ len = vsnprintf(buf, sizeof(buf), fmt, ap2);
va_end(ap2);
if (unlikely(len < 0)) {
return NULL;
@@ -2369,9 +2369,13 @@ _PUBLIC_ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap)
ret = (char *)__talloc(t, len+1);
if (unlikely(!ret)) return NULL;
- va_copy(ap2, ap);
- vsnprintf(ret, len+1, fmt, ap2);
- va_end(ap2);
+ if (len < sizeof(buf)) {
+ memcpy(ret, buf, len+1);
+ } else {
+ va_copy(ap2, ap);
+ vsnprintf(ret, len+1, fmt, ap2);
+ va_end(ap2);
+ }
_talloc_set_name_const(ret, ret);
return ret;