Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 01 Aug 2026 03:35:28 +0000
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 781defc7eb06 - main - stdio: *memstream: decouple the buffer size from the stream length
Message-ID:  <6a6d6980.32e43.6cc900c9@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=781defc7eb061a82b1e3e8dbc6b34993f23e79a6

commit 781defc7eb061a82b1e3e8dbc6b34993f23e79a6
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2026-08-01 03:34:37 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2026-08-01 03:34:37 +0000

    stdio: *memstream: decouple the buffer size from the stream length
    
    It's useful to be able to track both facts with a single variable, but
    it also makes it more difficult to change how the buffer size scales.
    
    As an example, Apple's implementation seems to scale the buffer size by
    1.5x on growth, presumably in an attempt to reduce trips into realloc().
    This might be questionable in the face of stdio buffering, but avoiding
    serious churn in the line- or un-buffered case is a net positive if
    doing so isn't incredibly invasive.
    
    Reviewed by:    des, jhb, obiwac
    Sponsored by:   Klara, Inc.
    Differential Revision:  https://reviews.freebsd.org/D57354
---
 lib/libc/stdio/open_memstream.c  | 13 +++++++++----
 lib/libc/stdio/open_wmemstream.c | 12 ++++++++----
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/lib/libc/stdio/open_memstream.c b/lib/libc/stdio/open_memstream.c
index 29de688376bf..d0a22bcfe59f 100644
--- a/lib/libc/stdio/open_memstream.c
+++ b/lib/libc/stdio/open_memstream.c
@@ -46,6 +46,7 @@
 struct memstream {
 	char **bufp;
 	size_t *sizep;
+	size_t size;
 	ssize_t len;
 	fpos_t offset;
 };
@@ -60,19 +61,22 @@ memstream_grow(struct memstream *ms, fpos_t newoff)
 		newsize = SSIZE_MAX - 1;
 	else
 		newsize = newoff;
-	if (newsize > ms->len) {
+	if (newsize > ms->size) {
 		buf = realloc(*ms->bufp, newsize + 1);
 		if (buf == NULL)
 			return (0);
 
 #ifdef DEBUG
 		fprintf(stderr, "MS: %p growing from %zd to %zd\n",
-		    ms, ms->len, newsize);
+		    ms, ms->size, newsize);
 #endif
-		memset(buf + ms->len + 1, 0, newsize - ms->len);
+		memset(buf + ms->size + 1, 0, newsize - ms->size);
 		*ms->bufp = buf;
-		ms->len = newsize;
+		ms->size = newsize;
 	}
+
+	if (newsize > ms->len)
+		ms->len = newsize;
 	return (1);
 }
 
@@ -192,6 +196,7 @@ open_memstream(char **bufp, size_t *sizep)
 	}
 	ms->bufp = bufp;
 	ms->sizep = sizep;
+	ms->size = 0;
 	ms->len = 0;
 	ms->offset = 0;
 	memstream_update(ms);
diff --git a/lib/libc/stdio/open_wmemstream.c b/lib/libc/stdio/open_wmemstream.c
index 0bed4cff5d11..d1844e573b1b 100644
--- a/lib/libc/stdio/open_wmemstream.c
+++ b/lib/libc/stdio/open_wmemstream.c
@@ -46,6 +46,7 @@
 struct wmemstream {
 	wchar_t **bufp;
 	size_t *sizep;
+	size_t size;
 	ssize_t len;
 	fpos_t offset;
 	mbstate_t mbstate;
@@ -61,18 +62,20 @@ wmemstream_grow(struct wmemstream *ms, fpos_t newoff)
 		newsize = SSIZE_MAX / sizeof(wchar_t) - 1;
 	else
 		newsize = newoff;
-	if (newsize > ms->len) {
+	if (newsize > ms->size) {
 		buf = reallocarray(*ms->bufp, newsize + 1, sizeof(wchar_t));
 		if (buf == NULL)
 			return (0);
 #ifdef DEBUG
 		fprintf(stderr, "WMS: %p growing from %zd to %zd\n",
-		    ms, ms->len, newsize);
+		    ms, ms->size, newsize);
 #endif
-		wmemset(buf + ms->len + 1, 0, newsize - ms->len);
+		wmemset(buf + ms->size + 1, 0, newsize - ms->size);
 		*ms->bufp = buf;
-		ms->len = newsize;
+		ms->size = newsize;
 	}
+	if (newsize > ms->len)
+		ms->len = newsize;
 	return (1);
 }
 
@@ -252,6 +255,7 @@ open_wmemstream(wchar_t **bufp, size_t *sizep)
 	}
 	ms->bufp = bufp;
 	ms->sizep = sizep;
+	ms->size = 0;
 	ms->len = 0;
 	ms->offset = 0;
 	memset(&ms->mbstate, 0, sizeof(mbstate_t));


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a6d6980.32e43.6cc900c9>