summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/talloc.h6
-rw-r--r--source3/lib/talloc.c80
2 files changed, 82 insertions, 4 deletions
diff --git a/source3/include/talloc.h b/source3/include/talloc.h
index d8a98f07e6..3f5b85c0b2 100644
--- a/source3/include/talloc.h
+++ b/source3/include/talloc.h
@@ -41,6 +41,12 @@ char *talloc_vasprintf(TALLOC_CTX *t, const char *fmt, va_list ap)
char *talloc_asprintf(TALLOC_CTX *t, const char *fmt, ...)
PRINTF_ATTRIBUTE(2, 3);
+char *talloc_vasprintf_append(TALLOC_CTX *t, char *, const char *, va_list ap)
+ PRINTF_ATTRIBUTE(3, 0);
+
+char *talloc_asprintf_append(TALLOC_CTX *t, char *, const char *, ...)
+ PRINTF_ATTRIBUTE(3, 4);
+
/** @} */
#endif /* ndef _TALLOC_H_ */
diff --git a/source3/lib/talloc.c b/source3/lib/talloc.c
index 8496170daf..3b4c3e9d15 100644
--- a/source3/lib/talloc.c
+++ b/source3/lib/talloc.c
@@ -1,9 +1,8 @@
/*
- Unix SMB/Netbios implementation.
- Version 3.0
+ Samba Unix SMB/Netbios implementation.
Samba temporary memory allocation functions
Copyright (C) Andrew Tridgell 2000
- Copyright (C) 2001 by Martin Pool <mbp@samba.org>
+ Copyright (C) 2001, 2002 by Martin Pool <mbp@samba.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -286,7 +285,6 @@ char *talloc_strdup(TALLOC_CTX *t, const char *p)
va_list ap;
char *ret;
- /* work out how long it will be */
va_start(ap, fmt);
ret = talloc_vasprintf(t, fmt, ap);
va_end(ap);
@@ -310,4 +308,78 @@ char *talloc_strdup(TALLOC_CTX *t, const char *p)
}
+/**
+ * Realloc @p s to append the formatted result of @p fmt and return @p
+ * s, which may have moved. Good for gradually accumulating output
+ * into a string buffer.
+ **/
+ char *talloc_asprintf_append(TALLOC_CTX *t, char *s,
+ const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ s = talloc_vasprintf_append(t, s, fmt, ap);
+ va_end(ap);
+ return s;
+}
+
+
+
+/**
+ * Realloc @p s to append the formatted result of @p fmt and @p ap,
+ * and return @p s, which may have moved. Good for gradually
+ * accumulating output into a string buffer.
+ **/
+ char *talloc_vasprintf_append(TALLOC_CTX *t, char *s,
+ const char *fmt, va_list ap)
+{
+ int len, s_len;
+
+ s_len = strlen(s);
+ len = vsnprintf(NULL, 0, fmt, ap);
+
+ s = talloc_realloc(t, s, s_len + len+1);
+ if (!s) return NULL;
+
+ vsnprintf(s+s_len, len+1, fmt, ap);
+
+ return s;
+}
+
+
+/**
+ * Return a human-readable description of all talloc memory usage.
+ * The result is allocated from @p t.
+ **/
+char *talloc_describe_all(TALLOC_CTX *t)
+{
+ int n_pools = 0;
+ size_t total = 0;
+ TALLOC_CTX *titer;
+ char *s;
+
+ s = talloc_asprintf(t, "global talloc allocations in pid%u:\n",
+ (unsigned) getpid());
+ s = talloc_asprintf_append(t, s, "name\n----\n");
+
+ for (titer = list_head; titer; titer = titer->next_ctx) {
+ n_pools++;
+ s = talloc_asprintf_append(t, s, "\"%s\"\n", titer->name);
+ }
+
+ s = talloc_asprintf_append(t, s, "-----\nTotal %d pools\n", n_pools);
+
+ return s;
+}
+
+
+
+/**
+ * Return an estimated memory usage for the specified pool. This does
+ * not include memory used by the underlying malloc implementation.
+ **/
+
+
+
/** @} */