[Patch/RFC] Fix libstdc++/9533
Paolo Carlini
pcarlini@unitus.it
Wed Mar 19 10:10:00 GMT 2003
Nathan Myers wrote:
>On Thu, Mar 13, 2003 at 01:54:48PM +0100, Paolo Carlini wrote:
>
>
>>the below fixes the problem by implementing a non-trivial showmanyc(),
>>as discussed thoroughly on the list during the last weeks.
>>
>>In particular, I would appreciate by reassured that the new
>>__basic_file<>::showmanyc_helper deals correctly with the various
>>possibilities.
>>
>>
>This patch needs some cleanup. I apologize for the delay in replying;
>I was sick as a dog all of last week.
>
Too bad. Anyway, thanks for your comments: I will try to prepare an
updated version during
this week (while Benjamin is working on the 27_io testsuite).
>First, the above code can only reveal information about sockets, and
>not, unfortunately, pipes. (On a pipe it reports failure.) So, the
>comment is not right. Still, sockets are important enough to merit
>the special treatment.
>
Ok.
>Second, passing zeroes to the recv() arguments isn't portable. I find
>that, on Linux, (1) we must actually provide a buffer for it to copy
>the characters into, and (2) it won't return a value larger than the
>indicated buffer size (even with MSG_TRUNC). This means you can't
>avoid having it copy the characters. (Drat.) The buffer used might as
>well be the actual stream buffer. This is still less expensive than
>an actual underflow, potentially, because we don't have to run the
>codecvt operation afterward. Further, we haven't actually messed with
>the socket state.
>
I see. This is really unfortunate, that we have to actually read the data :(
How much data we must be prepared to? Even gigabytes, I'm afraid! Just
to know with MSG_PEEK
how much data we'll actually extract later on (maybe, only maybe!).
Where do you suggest we store such data?
>I would prefer to express the above as
>
>
>>+#ifdef _GLIBCPP_S_ISREG_OR_S_IFREG
>>+ // Regular files.
>>+ struct stat __buffer;
>>+ int __ret = fstat(this->fd(), &__buffer);
>>+ if (!__ret && _GLIBCPP_S_ISREG_OR_S_IFREG(__buffer.st_mode))
>>+ if (__stdio)
>>+ return __buffer.st_size - ftell(_M_cfile);
>>+ else
>>+ return __buffer.st_size - lseek(this->fd(), 0, ios_base::cur);
>>+#endif
>>
>>
>
>with a corresponding definition for _GLIBCPP_S_ISREG_OR_S_IFREG
>constructed in configure.
>
Yes, this is much more clean. I have to learn a bit more about the
configury machinery in order to
do that, but I will try...
>>+
>>+ streamsize
>>+ showmanyc_helper(bool __stdio);
>>
>>
>As in several other patches that have come through, I believe this
>member name must be uglified. I don't mind if they're all fixed up
>in a separate patch.
>
Ok. To be honest, I didn't follow your exchanges with Gaby about this
and the conclusions you
arrived to. We'll deal with the issue in separate patch, as you say.
Paolo.
More information about the Libstdc++
mailing list