From patchwork Sat Jan 3 01:18:49 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1207 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403214; bh=BaApWjLu307s29Uuu2tgRNhD9JwqdCa/rAPqMz3+GCw=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=G/aqk7LQExdr4sZJR8r+bR3vZ203F/nf6C3eCTRJZ+0gEWGVDFDJQAW7To3dHuaxR s1gBjIqBqxGUQLuQmTuCo+WyWP5QSgyU0tHwZdaUx0CY6t14HacRAPxgEI8wir31G6 PFWn8Mc1jjPFHrufuw2lnvrS8E6eCaRbFbPGWGcyRpLQU1Btz8mgp9HWxm+nfTbrI9 ndBeo99sidOxYIffYyUtqmOF4vMOJ/cLJIMVzsyfkgQSvghO+juSrArAqhp7jNorR9 qYCCgFiSJPbWYQxLbiKEtRPRTvZLnLuuf2E9RFj5O1Eoc/vujJ3N7wb7uCgbQ8s88+ ZcTrYrNtA2SyA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id DB6F26904E for ; Fri, 2 Jan 2026 18:20:14 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id 6gNk1LdOMuj7 for ; Fri, 2 Jan 2026 18:20:14 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403213; bh=BaApWjLu307s29Uuu2tgRNhD9JwqdCa/rAPqMz3+GCw=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=u4dtuqlKqlBlJ9/dv8vyJZew/Hj8eU+2yzfr94m4CxxOOF74RQjUgWfaXcGPmcKAO pTzlMJJmZgfMtU2GtWQLVMsyjhgt8meq9FbBMa4vQpCE5P5KMl8u1zFPV8KtqZpyoN SSe0ztOBtUxugaD94KKJR8403Lzsf++F+wWCWotO3csPFF6U+9LPmYIK0IzKayXrb3 M+Kc6VW6n/CSPjhQnbdTCtSC68Gh4aumqESb1eb/2m8n+iinGS4b+r/xBtQIU3ji/X La12IytYi9HYc33+wr70HX1LDzOj+Hzjrq2psXuHllt44VIAqbYuvF7td1Kej4gc20 X2NH8RbDYAzgQ== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 0D9A369071 for ; Fri, 2 Jan 2026 18:20:13 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403210; bh=P4Y0tTrXgPITjloJZZloNOam382g/KZpTIFsbHAYlTM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e9/26b2jaGWkVZPADgrwLhZoMz+0PmKmys4W9iJxB2knvGmMeACYMiyvIIacpjrIR YNslLSw8HLNd83AA28iVsIde3Jqea7VBCR5iYv/Rb5y3L3J3P+7j6B1xKsprcvCpQY l3gV3FSHClCHIthlft/bPfXkSvRsBe3EQ3DomEch8kbwjNriWxuG1epqmCxnIGwyd7 8Ji0WLloJEAv0LQTxAB3S5dSykxZ1cyiwVtmfTahimwhvREdvg3ipPbF9c2JCm/0dz 8JBknZjhfW9F5bbW+HPtqJVdzE1DAulLcBmv/m4UBDa9iDCD4V9Ir/dY6Q1+iL73Xn TdApXt6DbKRDg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 54F8C68F87; Fri, 2 Jan 2026 18:20:10 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id mlN9v8KMyj9t; Fri, 2 Jan 2026 18:20:10 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403209; bh=JgpTyvuEqkeFxIIO4tscvqA/0gAZdgsmta/u2aOiOEw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MVu41J24rQc9kNOa+wbOvfMNGePbSycnl8Nv+UdB3mdbJTXDj6qoQcz9QzBpPhGQv 9zUauDXoKftRQqJk5rgqfhG3bozOzp2BRZonWplIQHZqa9g1U2iHq1QKLYnq9hAYV/ znwpGslik2jOODQ2DJrNmiI5RUwEbgNR5TCfyOCO9DscW5HRPTQHsWGfn25XnsJ4SS LbPTcxBi0p6usIqSOuX7ozwbydU4A0coH6ZlP8EOp/b/dIY+0K8n13O8CasMuLdiiG tZUyLMG4IBN9//qJC49XEH2WEGQSCh2wqE5bLk7N43wrmffXrcw8n2cego3+cdFhGG G5zgzcgCMuRfQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 926BE6904D; Fri, 2 Jan 2026 18:20:09 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Fri, 2 Jan 2026 18:18:49 -0700 Message-ID: <20260103011908.149445-14-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260103011908.149445-1-sjg@u-boot.org> References: <20260103011908.149445-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: SMFT5P5TGVT2RQWOLZDVG6YQSYRUERVO X-Message-ID-Hash: SMFT5P5TGVT2RQWOLZDVG6YQSYRUERVO X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 13/24] malloc: Refactor malloc_dump() to use output callback List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Replace direct printf calls in malloc_dump() with an output callback function. This introduces dump_out_fn type and dump_to_console() helper, with malloc_dump_impl() taking the callback and context pointer. This allows the same implementation logic to be reused for different output destinations such as writing to a file. Co-developed-by: Claude Signed-off-by: Simon Glass --- common/dlmalloc.c | 69 ++++++++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/common/dlmalloc.c b/common/dlmalloc.c index 71f81aeaec7..63792104ee3 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -7215,7 +7215,21 @@ static struct mcheck_hdr *find_freed_mcheck_hdr(void *mem, size_t sz) } #endif -void malloc_dump(void) +/* Output function type for malloc_dump_impl */ +typedef void (*dump_out_fn)(void *ctx, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); + +/* Console output function for heap dump */ +static void dump_to_console(void *ctx, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); +} + +static void malloc_dump_impl(dump_out_fn out, void *ctx) { mchunkptr q; msegmentptr s; @@ -7223,21 +7237,21 @@ void malloc_dump(void) int used_count = 0, free_count = 0; if (!is_initialized(gm)) { - printf("dlmalloc not initialized\n"); + out(ctx, "dlmalloc not initialized\n"); return; } - printf("Heap dump: %lx - %lx\n", mem_malloc_start, mem_malloc_end); - printf("%12s %10s %s\n", "Address", "Size", "Status"); - printf("----------------------------------\n"); + out(ctx, "Heap dump: %lx - %lx\n", mem_malloc_start, mem_malloc_end); + out(ctx, "%12s %10s %s\n", "Address", "Size", "Status"); + out(ctx, "----------------------------------\n"); s = &gm->seg; while (s != 0) { q = align_as_chunk(s->base); /* Show chunk header before first allocation */ - printf("%12lx %10zx (chunk header)\n", (ulong)s->base, - (size_t)((char *)chunk2mem(q) - (char *)s->base)); + out(ctx, "%12lx %10zx (chunk header)\n", (ulong)s->base, + (size_t)((char *)chunk2mem(q) - (char *)s->base)); while (segment_holds(s, q) && q != gm->top && q->head != FENCEPOST_HEAD) { @@ -7250,14 +7264,14 @@ void malloc_dump(void) hdr = find_mcheck_hdr_in_chunk(mem, sz); if (hdr && hdr->caller[0]) - printf("%12lx %10zx %s\n", - (ulong)mem, sz, hdr->caller); + out(ctx, "%12lx %10zx %s\n", + (ulong)mem, sz, hdr->caller); else - printf("%12lx %10zx\n", - (ulong)mem, sz); + out(ctx, "%12lx %10zx\n", + (ulong)mem, sz); #else - printf("%12lx %10zx\n", - (ulong)mem, sz); + out(ctx, "%12lx %10zx\n", + (ulong)mem, sz); #endif used += sz; used_count++; @@ -7267,14 +7281,14 @@ void malloc_dump(void) hdr = find_freed_mcheck_hdr(mem, sz); if (hdr && hdr->caller[0]) - printf("%12lx %10zx free %s\n", - (ulong)mem, sz, hdr->caller); + out(ctx, "%12lx %10zx free %s\n", + (ulong)mem, sz, hdr->caller); else - printf("%12lx %10zx free\n", - (ulong)mem, sz); + out(ctx, "%12lx %10zx free\n", + (ulong)mem, sz); #else - printf("%12lx %10zx free\n", - (ulong)mem, sz); + out(ctx, "%12lx %10zx free\n", + (ulong)mem, sz); #endif free_space += sz; free_count++; @@ -7286,15 +7300,20 @@ void malloc_dump(void) /* Print top chunk (wilderness) */ if (gm->top && gm->topsize > 0) { - printf("%12lx %10zx top\n", - (ulong)chunk2mem(gm->top), gm->topsize); + out(ctx, "%12lx %10zx top\n", + (ulong)chunk2mem(gm->top), gm->topsize); free_space += gm->topsize; } - printf("%12lx %10s end\n", mem_malloc_end, ""); - printf("----------------------------------\n"); - printf("Used: %zx bytes in %d chunks\n", used, used_count); - printf("Free: %zx bytes in %d chunks + top\n", free_space, free_count); + out(ctx, "%12lx %10s end\n", mem_malloc_end, ""); + out(ctx, "----------------------------------\n"); + out(ctx, "Used: %zx bytes in %d chunks\n", used, used_count); + out(ctx, "Free: %zx bytes in %d chunks + top\n", free_space, free_count); +} + +void malloc_dump(void) +{ + malloc_dump_impl(dump_to_console, NULL); } int initf_malloc(void)