From patchwork Sat Jan 3 20:04: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: 1236 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=1767470804; bh=Zl2i6UxWATcoCBQ3HPO0fTIcevOtreZmksfQOWDZD+g=; 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=MXWQHtpSjSPjXOF7iUdJC+hCNw6Y+g3OMNBqfMmfDUnv2ClfQdWC/LN+/AAxrtuVB kKmy6lXeqmwqw2vhtcDZcjLa3DvPz3z8NCV3YsGI1EmBTn2MMmdok+9MdG8Oy7dtVv Ls+6ovhvROCRk0aYEL5NTz68ZtqXq+/UFr4Ykm/n9miSd6HFw0BjaEkK7KFPXVHOHU w3Cv2l01/3b3Vk6g8PzbElGq+oiVhM95i3/dKTkc97gpw4Yihw3TkoJ3Lul/obwgCU s9dIKs8UqhzPR+XrZZi4fxjmCRA3IG75mvtblT9/wvYZDeM9CZeReqrzigc3aAkYMO e1V0tAJy+rACw== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 02E17690A1 for ; Sat, 3 Jan 2026 13:06:44 -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 uVuceDgtqcly for ; Sat, 3 Jan 2026 13:06:43 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767470803; bh=Zl2i6UxWATcoCBQ3HPO0fTIcevOtreZmksfQOWDZD+g=; 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=PdvdXOkAF5jwtL0lYW2w0lvmuH1fOWQuk6F25fZin1B8WA3kzJQrhTpmzXCbOtd+/ uBMySgfaKk+z76C8q8VDgpZ24Z2CiFE8m9Z1wmeoLBVLhxUcFbOxUaEKyhQk0kzPe5 oq/bX3MgkChNTkV+Vbg8Q/t9SymMEB7Akigc3HniZnIN1aqiioj/brRVTCDcdrcYI/ W7EUl3w/YeeCQLpE0v/ls4qE+EfzvbzhxBgbc89xmSM9MZ+5cxFweERorHOqEr9MEv xvyFU6jB08XopkNdqPAqv3L64TL27IA5RHg00LhwB7CGKEkLSXOC1BPX3dlcMCX+qF 2wcN7XKqUCRQQ== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id E768169095 for ; Sat, 3 Jan 2026 13:06:43 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767470802; bh=/dpVJYSxTrZkpEARaxFgyqDK+L6IF2glfEc5qC1DZfY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pdQ+ziu5bsKONQ6yN5JZfogzGpFnXKiQxbDWMD8X6oEH/MYxZ0CjpVH3TdGxAYt7e cxayWgBRG2BaUWkW5kWkEFqaJw1ozxeSWQOfpfJRGfZT3IYY8Qa1hKJbUyD4Vinhmu s10KQv9Dnk9Y9t2a44IHaSciL/tX5h+Oisu4L1doJyDDqVXWU21V0nI6fy15j404lr e5qchZ4ezswAUHSiT8i2hI+TaDfsYI9rihHadTjaiRSavYkYgCX3DWf4lkUDeQ0ykP jnGcxuyG1I613mQRTRO3gKq2RUju54eCa83kOfgXCWW+H3qrFZaBCRug6XDA1wJsS7 bCXMumB6mjJ5g== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 5A28E68FD2; Sat, 3 Jan 2026 13:06:42 -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 TIPR2526gho2; Sat, 3 Jan 2026 13:06:42 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767470798; bh=HhJQsWRQiiMLy72ZmP1jZIzV6E876HzPQoB4QE6RRPk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MtFGkBcj2yOVraPVGq4qxYgKtPDlZRBSgZAbii0HX1+NpaisvtNfZI0QoftcTatJr T11A+l2bUwfCOiOgYZb2KUVysWMqbpZJRqHdNRuuNSSust1yz04F1J70zk1pVoqQw8 rTnOe1yf2q6U9rfVzWXv1blLRVQWANHfXdi09v8OHhoyzGcFq4L1OKowtqX3ZQXm2Q OGRnW5acQLK4/5kAAI0yHeiWtdOR1L14qkUohuy2qE6MiVOR1qoMLhUJdzG/62yuZI DopxuYb6HhW887huUAfmeHYG+kAykza4LLDtlng/86Y5f81dFyXNY+5Ps4Gq7bOEeV xaZISbEQIBlvQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id F16D968FCC; Sat, 3 Jan 2026 13:06:37 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Sat, 3 Jan 2026 13:04:49 -0700 Message-ID: <20260103200510.3605009-19-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260103200510.3605009-1-sjg@u-boot.org> References: <20260103200510.3605009-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: MYGBUOC7NRWALX4SLQQM5QB5G2PGU4VN X-Message-ID-Hash: MYGBUOC7NRWALX4SLQQM5QB5G2PGU4VN 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 v2 18/29] 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 --- (no changes since v1) common/dlmalloc.c | 69 ++++++++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/common/dlmalloc.c b/common/dlmalloc.c index 71f81aeaec7..fae1d28a599 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, ...) + __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)