[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20260203103000.20206-3-david.laight.linux@gmail.com>
Date: Tue, 3 Feb 2026 10:29:50 +0000
From: david.laight.linux@...il.com
To: Willy Tarreau <w@....eu>,
Thomas Weißschuh <linux@...ssschuh.net>,
linux-kernel@...r.kernel.org,
Cheng Li <lechain@...il.com>
Cc: David Laight <david.laight.linux@...il.com>
Subject: [PATCH next 02/12] tools/nolibc/printf: Add buffering to vfprintf() callback.
From: David Laight <david.laight.linux@...il.com>
Add per-call buffering to the vprintf() callback.
While this adds some extra code it will speed things up and
makes a massive difference to anyone looking at strace output.
Signed-off-by: David Laight <david.laight.linux@...il.com>
---
tools/include/nolibc/stdio.h | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h
index 6c8fa41dbc01..985e10d747db 100644
--- a/tools/include/nolibc/stdio.h
+++ b/tools/include/nolibc/stdio.h
@@ -381,15 +381,41 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, va_list
return written;
}
-static int __nolibc_fprintf_cb(void *stream, const char *buf, size_t size)
+struct __nolibc_fprintf_cb_state {
+ FILE *stream;
+ unsigned int buf_offset;
+ char buf[128];
+};
+
+static int __nolibc_fprintf_cb(void *v_state, const char *buf, size_t size)
{
- return size ? _fwrite(buf, size, stream) : 0;
+ struct __nolibc_fprintf_cb_state *state = v_state;
+ unsigned int off = state->buf_offset;
+
+ if (off + size > sizeof(state->buf) || buf == NULL) {
+ state->buf_offset = 0;
+ if (off && _fwrite(state->buf, off, state->stream))
+ return -1;
+ if (size > sizeof(state->buf))
+ return _fwrite(buf, size, state->stream);
+ off = 0;
+ }
+
+ if (size) {
+ state->buf_offset = off + size;
+ memcpy(state->buf + off, buf, size);
+ }
+ return 0;
}
static __attribute__((unused, format(printf, 2, 0)))
int vfprintf(FILE *stream, const char *fmt, va_list args)
{
- return __nolibc_printf(__nolibc_fprintf_cb, stream, fmt, args);
+ struct __nolibc_fprintf_cb_state state;
+
+ state.stream = stream;
+ state.buf_offset = 0;
+ return __nolibc_printf(__nolibc_fprintf_cb, &state, fmt, args);
}
static __attribute__((unused, format(printf, 1, 0)))
--
2.39.5
Powered by blists - more mailing lists