Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/sys Rework the text of poll(2) for clarity. Bump date.



details:   https://anonhg.NetBSD.org/src/rev/a6f1d576ed29
branches:  trunk
changeset: 951960:a6f1d576ed29
user:      dholland <dholland%NetBSD.org@localhost>
date:      Tue Feb 09 00:50:47 2021 +0000

description:
Rework the text of poll(2) for clarity. Bump date.

diffstat:

 lib/libc/sys/poll.2 |  222 +++++++++++++++++++++++++++++----------------------
 1 files changed, 125 insertions(+), 97 deletions(-)

diffs (291 lines):

diff -r 741e33256646 -r a6f1d576ed29 lib/libc/sys/poll.2
--- a/lib/libc/sys/poll.2       Mon Feb 08 23:54:03 2021 +0000
+++ b/lib/libc/sys/poll.2       Tue Feb 09 00:50:47 2021 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: poll.2,v 1.33 2021/02/07 18:22:51 rillig Exp $
+.\"    $NetBSD: poll.2,v 1.34 2021/02/09 00:50:47 dholland Exp $
 .\"
 .\" Copyright (c) 1998, 2005, 2020 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd May 25, 2020
+.Dd February 8, 2021
 .Dt POLL 2
 .Os
 .Sh NAME
@@ -56,95 +56,27 @@
 .Fn ppoll
 examine a set of file descriptors to see if some of them are ready for
 I/O.
+For each object inspected, the caller provides a list of conditions
+(called ``events'') to check for, and the kernel returns a list of 
+conditions that are true.
+The intent, as with
+.Xr select 2 ,
+is to check for whether I/O is possible before performing any, so as
+to permit a top-level event loop to process input from many sources
+(and output to many destinations)
+without blocking on any of them and thus becoming stuck.
+.Ss Arguments
 The
 .Fa fds
-argument is a pointer to an array of pollfd structures as defined in
+argument is a pointer to an array of pollfd structures, one per file
+to inspect, as defined in
 .In poll.h
 (shown below).
 The
 .Fa nfds
-argument determines the size of the
+argument gives the size of the
 .Fa fds
 array.
-.Bd -literal
-struct pollfd {
-    int    fd;       /* file descriptor */
-    short  events;   /* events to look for */
-    short  revents;  /* events returned */
-};
-.Ed
-.Pp
-The fields of
-.Fa struct pollfd
-are as follows:
-.Bl -tag -width XXXrevents
-.It fd
-File descriptor to poll.
-If the value in
-.Em fd
-is negative, the file descriptor is ignored and
-.Em revents
-is set to 0.
-.It events
-Events to poll for.
-(See below.)
-.It revents
-Events which may occur.
-(See below.)
-.El
-.Pp
-The event bitmasks in
-.Fa events
-and
-.Fa revents
-have the following bits:
-.Bl -tag -width XXXPOLLWRNORM
-.It POLLIN
-Data other than high priority data may be read without blocking.
-.It POLLRDNORM
-Normal data may be read without blocking.
-.It POLLRDBAND
-Data with a non-zero priority may be read without blocking.
-.It POLLPRI
-High priority data may be read without blocking.
-.It POLLOUT
-Normal data may be written without blocking.
-.It POLLWRNORM
-Equivalent to
-POLLOUT.
-.It POLLWRBAND
-Data with a non-zero priority may be written without blocking.
-.It POLLERR
-An exceptional condition has occurred on the device or socket.
-This flag is always checked, even if not present in the
-.Fa events
-bitmask.
-.It POLLHUP
-The device or socket has been disconnected.
-This flag is always
-checked, even if not present in the
-.Fa events
-bitmask.
-Note that
-POLLHUP
-and
-POLLOUT
-should never be present in the
-.Fa revents
-bitmask at the same time.
-If the remote end of a socket is closed,
-.Fn poll
-returns a
-POLLIN
-event, rather than a
-POLLHUP.
-.It POLLNVAL
-The file descriptor is not open.
-This flag is always checked, even
-if not present in the
-.Fa events
-bitmask.
-.El
 .Pp
 If
 .Fa timeout
@@ -152,14 +84,16 @@
 wait for any file descriptor to become ready, in milliseconds.
 If
 .Fa timeout
-is INFTIM (\-1), the poll blocks indefinitely.
+is INFTIM (\-1), then
+.Pn poll
+blocks indefinitely.
 If
 .Fa timeout
 is zero, then
 .Fn poll
 will return without blocking.
 .Pp
-If
+Similarly, if
 .Fa ts
 is a non-null pointer, it references a timespec structure which specifies a
 maximum interval to wait for any file descriptor to become ready.
@@ -169,7 +103,7 @@
 .Fn pollts
 and
 .Fn ppoll
-blocks indefinitely.
+block indefinitely.
 If
 .Fa ts
 is a non-null pointer, referencing a zero-valued timespec structure, then
@@ -184,11 +118,97 @@
 .Fn pollts
 and
 .Fn ppoll
-function shall replace the signal mask of the caller by the set of
+functions replace the signal mask of the caller by the set of
 signals pointed to by
 .Fa sigmask
-before examining the descriptors, and shall restore the signal mask
-of the caller before returning.
+while the call is in progress, and restore the caller's original
+signal mask before returning.
+.Pp
+The
+.Vt pollfd
+structure:
+.Bd -literal
+struct pollfd {
+    int    fd;       /* file descriptor */
+    short  events;   /* events to look for */
+    short  revents;  /* events returned */
+};
+.Ed
+.\" without this Pp there is no blank line after the struct which is oogly
+.Pp
+The fields of
+.Fa struct pollfd
+are as follows:
+.Pp
+.Bl -tag -width XXXrevents -compact
+.It Fa fd
+File descriptor to poll.
+(Input)
+.It Fa events
+Conditions to poll for.
+(Input)
+.It Fa revents
+Conditions that are true.
+(Output)
+.El
+.Pp
+.Ss Conditions
+There are four conditions that can be placed in
+.Fa events
+and reported in 
+.Fa revents :
+.Pp
+.Bl -tag -width XXXPOLLWRNORM -compact
+.It POLLRDNORM
+Normal data may be read without blocking.
+.It POLLRDBAND
+Urgent/out-of-band data may be read without blocking.
+.It POLLWRNORM
+Normal data may be written without blocking.
+.It POLLWRBAND
+Urgent/out-of-band data may be written without blocking.
+.El
+.Pp
+There are three more conditions that are always checked for regardless
+of
+.Fa events
+and thus may always be reported in
+.Fa revents :
+.Pp
+.Bl -tag -width XXXPOLLWRNORM -compact
+.It POLLERR
+An exceptional condition has occurred on the object.
+.It POLLHUP
+The object has been disconnected.
+.It POLLNVAL
+The file descriptor is not open.
+.El
+.Pp
+The following additional flags are defined:
+.Pp
+.Bl -tag -width XXXPOLLWRNORM -compact
+.It POLLIN
+Synonym for POLLRDNORM.
+.It POLLOUT
+Synonym for POLLWRNORM.
+.It POLLPRI
+Synonym for POLLRDBAND.
+.El
+.Ss Notes
+If the value passed in
+.Fa fd
+is negative, the entry is ignored and
+.Fa revents
+is set to 0.
+(POLLNVAL is
+.Em not
+set.)
+.Pp
+No file descriptor will ever produce POLLHUP at the same time as POLLWRNORM.
+.\" (XXX but what about POLLWRBAND? POLLRDBAND? POLLRDNORM?)
+.Pp
+Sockets produce POLLIN rather than POLLHUP when the remote
+end is closed.
 .Sh RETURN VALUES
 .Fn poll
 returns the number of descriptors that are ready for I/O, or \-1 if an
@@ -204,8 +224,8 @@
 .Fa fds
 array will be unmodified.
 .Sh COMPATIBILITY
-This implementation differs from the historical one in that a given
-file descriptor may not cause
+This implementation differs from the historical one in that no individual
+file descriptor may cause
 .Fn poll
 to return with an error.
 In cases where this would have happened in the historical implementation
@@ -262,9 +282,17 @@
 function first appeared in
 .Nx 10.0 .
 .Sh BUGS
-The distinction between some of the fields in the
-.Fa events
-and
-.Fa revents
-bitmasks is really not useful without STREAMS.
-The fields are defined for compatibility with existing software.
+As of this writing, in the underlying implementation, POLLIN and
+POLLPRI are distinct flags from POLLRDNORM and POLLRDBAND
+(respectively) and the behavior is not always exactly identical.
+.Pp
+The detailed behavior of specific flags is not very portable from one
+OS to another.
+.\" The old note, which is too vague to be helpful:
+.\"
+.\" The distinction between some of the fields in the
+.\" .Fa events
+.\" and
+.\" .Fa revents
+.\" bitmasks is really not useful without STREAMS.
+.\" The fields are defined for compatibility with existing software.



Home | Main Index | Thread Index | Old Index