Why fixing 9533 doesn't fix 7744: revealed!
Paolo Carlini
pcarlini@unitus.it
Wed Mar 5 20:19:00 GMT 2003
Hi,
Nathan Myers wrote:
>OK, syncing with stdio is a special case. I am not surprised to see
>in_avail() call showmanyc() for that case, nor to find it reporting 0.
>The _M_set_indeterminate() call is necessary so that the next sgetc()
>will call underflow(), and get the character out of stdin's putback
>cell. It is necessary to have _M_buf_size == 1 when synced with stdio.
>
Ok, thanks for the explanation.
>If the program began with "std::ios::sync_with_stdio(false);" I would hope
>for different behavior. In other words, 7744 is "not a bug" without a
>call to std::ios::sync_with_stdio(false). However, I find that even when
>it has been called, in_avail() still returns zero on cin. That's the bug.
>When that call occurs before any input, then you would like to have a
>normal big buffer, so the next underflow will fill it as much as it can.
>
Ok, let's try to fix this, then. I'm afraid this is the upshot of a recent
commit of mine (and Loren's). There is this code in src/ios.cc
size_t __in_size =
(__sync || isatty (0)) ? 1 : static_cast<size_t>(BUFSIZ);
We introduced that isatty(0) in order to fix an _interactive_ bug, that is
libstdc++/8399:
http://gcc.gnu.org/ml/libstdc++/2002-11/msg00096.html
Basically, this kind of testcase:
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
char c;
cin.get(c);
return 0;
}
didn't terminate upon newline. I thought, at the time, that the problem
could not be avoided in other ways, since (citing myself ;):
>Basically this behaviour can be traced back to the call
>
> __elen = _M_file.xsgetn(reinterpret_cast<char*>(_M_in_beg),
> _M_buf_size);
>
>in basic_filebuf<char>::_M_underflow_common: when 'sync'
>is false _M_buf_size is BUFSIZ, that is 8192 on x86-linux, and
>since xsgetn is implemented as fread(__s, 1, __n, _M_cfile)
>with __n == _M_buf_size, the observed behaviour is obtained.
Nathan, fellow v3 contributors, what can be do to have a big buffer
without breaking 8399-type interactive code?
Thanks in advance,
Paolo.
More information about the Libstdc++
mailing list