summaryrefslogtreecommitdiffstats
path: root/lib/util/talloc_report_printf.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
commit8daa83a594a2e98f39d764422bfbdbc62c9efd44 (patch)
tree4099e8021376c7d8c05bdf8503093d80e9c7bad0 /lib/util/talloc_report_printf.c
parentInitial commit. (diff)
downloadsamba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.tar.xz
samba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.zip
Adding upstream version 2:4.20.0+dfsg.upstream/2%4.20.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/util/talloc_report_printf.c')
-rw-r--r--lib/util/talloc_report_printf.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/lib/util/talloc_report_printf.c b/lib/util/talloc_report_printf.c
new file mode 100644
index 0000000..3011c62
--- /dev/null
+++ b/lib/util/talloc_report_printf.c
@@ -0,0 +1,134 @@
+/*
+ * talloc_report into a FILE
+ *
+ * Copyright Volker Lendecke <vl@samba.org> 2015
+ *
+ * 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "replace.h"
+#include "talloc_report_printf.h"
+
+static void talloc_report_printf_helper(
+ const void *ptr,
+ int depth,
+ int max_depth,
+ int is_ref,
+ void *private_data)
+{
+ FILE *f = private_data;
+ const char *name = talloc_get_name(ptr);
+
+ if (is_ref) {
+ fprintf(f,
+ "%*sreference to: %s\n",
+ depth*4,
+ "",
+ name);
+ return;
+ }
+
+ if (depth == 0) {
+ fprintf(f,
+ "%stalloc report on '%s' "
+ "(total %6zu bytes in %3zu blocks)\n",
+ (max_depth < 0 ? "full " :""), name,
+ talloc_total_size(ptr),
+ talloc_total_blocks(ptr));
+ return;
+ }
+
+ if (strcmp(name, "char") == 0) {
+ /*
+ * Print out the first 50 bytes of the string
+ */
+ fprintf(f,
+ "%*s%-30s contains %6zu bytes in %3zu blocks "
+ "(ref %zu): %*s\n", depth*4, "", name,
+ talloc_total_size(ptr),
+ talloc_total_blocks(ptr),
+ talloc_reference_count(ptr),
+ (int)MIN(50, talloc_get_size(ptr)),
+ (const char *)ptr);
+ return;
+ }
+
+ fprintf(f,
+ "%*s%-30s contains %6zu bytes in %3zu blocks (ref %zu) %p\n",
+ depth*4, "", name,
+ talloc_total_size(ptr),
+ talloc_total_blocks(ptr),
+ talloc_reference_count(ptr),
+ ptr);
+}
+
+void talloc_full_report_printf(TALLOC_CTX *root, FILE *f)
+{
+ talloc_report_depth_cb(root, 0, -1, talloc_report_printf_helper, f);
+#if defined(HAVE_MALLINFO2)
+ {
+ struct mallinfo2 mi2 = mallinfo2();
+
+ fprintf(f,
+ "mallinfo:\n"
+ " arena: %zu\n"
+ " ordblks: %zu\n"
+ " smblks: %zu\n"
+ " hblks: %zu\n"
+ " hblkhd: %zu\n"
+ " usmblks: %zu\n"
+ " fsmblks: %zu\n"
+ " uordblks: %zu\n"
+ " fordblks: %zu\n"
+ " keepcost: %zu\n",
+ mi2.arena,
+ mi2.ordblks,
+ mi2.smblks,
+ mi2.hblks,
+ mi2.hblkhd,
+ mi2.usmblks,
+ mi2.fsmblks,
+ mi2.uordblks,
+ mi2.fordblks,
+ mi2.keepcost);
+ }
+#elif defined(HAVE_MALLINFO)
+ {
+ struct mallinfo mi = mallinfo();
+
+ fprintf(f,
+ "mallinfo:\n"
+ " arena: %d\n"
+ " ordblks: %d\n"
+ " smblks: %d\n"
+ " hblks: %d\n"
+ " hblkhd: %d\n"
+ " usmblks: %d\n"
+ " fsmblks: %d\n"
+ " uordblks: %d\n"
+ " fordblks: %d\n"
+ " keepcost: %d\n",
+ mi.arena,
+ mi.ordblks,
+ mi.smblks,
+ mi.hblks,
+ mi.hblkhd,
+ mi.usmblks,
+ mi.fsmblks,
+ mi.uordblks,
+ mi.fordblks,
+ mi.keepcost);
+ }
+#endif /* HAVE_MALLINFO2 or HAVE_MALLINFO */
+}