Toward a satisfactory showmanyc
Paolo Carlini
pcarlini@unitus.it
Thu Mar 20 23:36:00 GMT 2003
Hi,
Nathan Myers wrote:
>Certainly the overwhelming bulk of the implementation work will be in
>the autoconf machinery. (Fortunately, "#ifdef FIONREAD" works, which
>might reduce complexity a little bit.)
>
>I am sensitive about the performance implications of calling fstat()
>first. On any given platform ioctl() or FIONREAD might not exist.
>I'm thinking it should try, in order:
>
> ioctl
> If the test is #ifdef'ed out, fine. If it fails, fine.
> If it reports a positive number, return it. If it reports
> a negative number, it's probably a file bigger than 2G, so
> skip to the next test. Otherwise...
> poll
> A cheap test -- if it reports "not ready", return 0.
> Note that it reports "ready" if the next read will say EOF,
> so "ready" just tells us it's worth looking more closely.
> fstat
> If it says the fd is a file, then use st_size as in your
> existing patch. If it says the fd is a pipe or stream, the
> ioctl above must have been #ifdef'd out; but, if it reports
> a non-zero st_size (which works on some targets), use it.
> If it fails, report 0. Probably we should be using fstat64
> where it exists.
>
Ok, thanks. In the next days I will start implementing your detailed
outline:
when I posted my first message, today, I didn't know how to check for a
failure of
ioctl, but in the meanwhile I learned that (from libjava ;) and
everything seems
rather easily doable exactly as you write.
>For the case of a socket, we could use a funny search after all the
>above has failed: set the SO_RCVLOWAT socket option to increasing
>values until poll() reports "not ready", and then restore
>SO_RECVLOWAT and report the last "ready" value. The problem is
>that since it reports "ready" at EOF, you can't trust it if it
>never reports "not ready". So, if you get tired of quadrupling
>(e.g. you've hit 64K, seven calls) and still get "ready", try
>a really large value, e.g. 1<<24, -- and if it still reports ready
>you know it's at EOF, and you report -1; otherwise, just report the
>64K.
>
>Note that setsockopt SO_RCVLOWAT (like ioctl) is not required by POSIX.
>
>Of course it's up to you to decide how much work you want to put into
>supporting this; at whatever point you think you and library have
>tried hard enough, return 0.
>
;) Well, in this first round I would probably leave out this refinement
for sockets and
also the large file support part: we still hope to have this in before
3.3, and we have not
much time to write and test thoroughly the whole beast.
Paolo.
More information about the Libstdc++
mailing list