svn commit: r196460 - head/sys/kern
Kostik Belousov
kostikbel at gmail.com
Sun Aug 23 22:49:17 UTC 2009
On Sun, Aug 23, 2009 at 11:38:00PM +0200, Jilles Tjoelker wrote:
> On Sun, Aug 23, 2009 at 12:44:15PM +0000, Konstantin Belousov wrote:
> > Author: kib
> > Date: Sun Aug 23 12:44:15 2009
> > New Revision: 196460
> > URL: http://svn.freebsd.org/changeset/base/196460
>
> > Log:
> > Fix the conformance of poll(2) for sockets after r195423 by
> > returning POLLHUP instead of POLLIN for several cases. Now, the
> > tools/regression/poll results for FreeBSD are closer to that of the
> > Solaris and Linux.
>
> > Also, improve the POSIX conformance by explicitely clearing POLLOUT
> > when POLLHUP is reported in pollscan(), making the fix global.
>
> > Submitted by: bde
> > Reviewed by: rwatson
> > MFC after: 1 week
...
> > Modified: head/sys/kern/uipc_socket.c
> > ==============================================================================
> > --- head/sys/kern/uipc_socket.c Sun Aug 23 12:23:24 2009 (r196459)
> > +++ head/sys/kern/uipc_socket.c Sun Aug 23 12:44:15 2009 (r196460)
> > @@ -2898,13 +2898,11 @@ sopoll_generic(struct socket *so, int ev
> > if (so->so_oobmark || (so->so_rcv.sb_state & SBS_RCVATMARK))
> > revents |= events & (POLLPRI | POLLRDBAND);
> >
> > - if ((events & POLLINIGNEOF) == 0) {
> > - if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
> > - revents |= events & (POLLIN | POLLRDNORM);
> > - if (so->so_snd.sb_state & SBS_CANTSENDMORE)
> > - revents |= POLLHUP;
> > - }
> > - }
> > + if ((events & POLLINIGNEOF) == 0)
> > + if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
> > + revents |= POLLHUP;
> > + if (so->so_snd.sb_state & SBS_CANTSENDMORE)
> > + revents |= POLLHUP;
> >
> > if (revents == 0) {
> > if (events & (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND)) {
>
> This sets POLLHUP when either of the directions has shut down, instead
> of the entire connection. This breaks use of select and poll with
> shutdown(2):
>
> * sending some data, shutdown(SHUT_WR) then polling for input
> * (the other side for the above) receiving some data, getting EOF on
> that direction then polling for output
> * a paranoid HTTP-like server that wants to wait for the client to close
> the read end after shutting down the write end
>
> Either some data is lost or the program busy-waits for the data.
Exactly this situation concerned me and Robert.
>
> I think the POLLHUP setting before this commit was correct for sockets:
> POLLHUP is set if both directions are closed/error. An EOF that only
> affects one direction sets the corresponding POLLIN/POLLOUT so that the
> EOF becomes known but the other direction can still be used normally.
>
> (The POSIX spec explicitly describes something like this for POLLIN
> (zero length message) although it erroneously restricts it to STREAMS
> files only; the POLLOUT case has to be derived from the fact that the
> read end should still work normally but the EOF should be notified.)
>
> I think poll on fifos should instead be fixed by closing the
> half-connection corresponding to writing from fi_readsock to
> fi_writesock. I have tried this out, see attached patch. With the patch,
> pipepoll only gives "expected POLLHUP; got POLLIN | POLLHUP" errors and
> an error in fifo case 6b caused by our distinction between new and old
> readers.
This sounds right.
Please go ahead.
>
> tools/regression/poll does not test shutdown(2) interaction, so it does
> not find this problem.
>
> --
> Jilles Tjoelker
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-head/attachments/20090823/e37a6e84/attachment.pgp
More information about the svn-src-head
mailing list