bin/166660: [libc] [patch] New util/shlib to change per-fd default stdio buffering mode

Jeremie Le Hen jeremie at
Sat Apr 14 13:20:12 UTC 2012

The following reply was made to PR bin/166660; it has been noted by GNATS.

From: Jeremie Le Hen <jeremie at>
To: John Baldwin <jhb at>
Cc: Jeremie Le Hen <jeremie at>, bug-followup at
Subject: Re: bin/166660: [libc] [patch] New util/shlib to change per-fd
 default stdio buffering mode
Date: Sat, 14 Apr 2012 15:11:31 +0200

 On Tue, Apr 10, 2012 at 09:43:16AM -0400, John Baldwin wrote:
 > On Monday, April 09, 2012 5:21:03 pm Jeremie Le Hen wrote:
 > > Hi John,
 > > 
 > > On Mon, Apr 09, 2012 at 11:30:08AM -0400, John Baldwin wrote:
 > > > I think it would be fine to do this in libc directly rather than via
 > > > LD_PRELOAD.  That would let it work for static binaries as well as
 > > > dynamic libraries.  My understanding is that this is how stdbuf works on
 > > > Linux (glibc honors the relevant magic environment variables).  To that
 > > > end, I think it would be ok to move this into libc directly.
 > > 
 > > I thought it would be too expensive to check for three (actually up to
 > > six, see below) in such a critical path.  Moreover, this would have
 > > lowered a lot my chances to see this committed simply because very few
 > > committers would have taken the responsibility for this and the time to
 > > handle the debates that would have sprouted.
 > > 
 > > Your point for static binaries is very valid but aren't you afraid of
 > > the performance impact?  I'll try to spare some time this week to move
 > > libstdbuf code into libc and do some benchmarks.
 > Hmm, I hadn't considered the performance impact, but to be honest, this
 > is stdio. :)  If it only happens once when stdio is first used then I think
 > this is fine to do in libc.
 I looked in the stdio source to see how I could implement there
 efficiently, but the problem is that there isn't a single entry point.
 The best I can do I think is basically something like this:
     int stdbuf_done = 0;
 	/* libstdbuf code */
 	stdbuf_done = 1;
     #define STDBUF()    if (!stdbuf_done) _stdbuf()
 And scatter STDBUF() all around.  What do you think of it?
 (FWIW, I checked how Linux implemented this, they used an additional
 shared library.)
 > > > One more question, do you use the same environment variable as glibc for
 > > > this, or do you use a different scheme?
 > > 
 > > I didn't like the GNU variable names (_STDBUF_I, _STDBUF_O and
 > > _STDBUF_E) so I used STDBUF_0, STDBUF_1 and STDBUF_2 instead.  But the
 > > former are supported for obvious compatibility reasons.  To be honest I
 > > don't really care about the names, we can use the GNU ones if you think
 > > it's better to avoid doing to much strcmp(3), especially if we but the
 > > code in the libc startup path.
 > If the variable values have the same semantics, then I think it is best to 
 > simply use the same names as glibc.
 Ok, I'll do this.
 Jeremie Le Hen
 Men are born free and equal.  Later on, they're on their own.
 				Jean Yanne

More information about the freebsd-bugs mailing list