Make it possible to implement poll(2) on top of kqueue(2).

It looks like EVFILT_READ and EVFILT_WRITE trigger under the same
conditions as poll()'s POLLRDNORM and POLLWRNORM as described by POSIX.
The only difference is that POLLRDNORM has to be triggered on regular
files unconditionally, whereas EVFILT_READ only triggers when not EOF.

Introduce a new flag, NOTE_FILE_POLL, that can be used to make
EVFILT_READ and EVFILT_WRITE behave identically to poll(). This flag
will be used by cloudlibc's poll() function.

Reviewed by:	jmg
Differential Revision:	https://reviews.freebsd.org/D3303
This commit is contained in:
Ed Schouten 2015-08-05 07:34:29 +00:00
parent c1987c2852
commit 2433a4eb04
3 changed files with 11 additions and 2 deletions

View File

@ -24,7 +24,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd March 29, 2015 .Dd August 4, 2015
.Dt KQUEUE 2 .Dt KQUEUE 2
.Os .Os
.Sh NAME .Sh NAME
@ -288,6 +288,14 @@ Returns when the file pointer is not at the end of file.
.Va data .Va data
contains the offset from current position to end of file, contains the offset from current position to end of file,
and may be negative. and may be negative.
.Pp
This behavior is different from
.Xr poll 2 ,
where read events are triggered for regular files unconditionally.
This event can be triggered unconditionally by setting the
.Dv NOTE_FILE_POLL
flag in
.Va fflags .
.It "Fifos, Pipes" .It "Fifos, Pipes"
Returns when the there is data to read; Returns when the there is data to read;
.Va data .Va data

View File

@ -4622,7 +4622,7 @@ filt_vfsread(struct knote *kn, long hint)
VI_LOCK(vp); VI_LOCK(vp);
kn->kn_data = va.va_size - kn->kn_fp->f_offset; kn->kn_data = va.va_size - kn->kn_fp->f_offset;
res = (kn->kn_data != 0); res = (kn->kn_sfflags & NOTE_FILE_POLL) != 0 || kn->kn_data != 0;
VI_UNLOCK(vp); VI_UNLOCK(vp);
return (res); return (res);
} }

View File

@ -108,6 +108,7 @@ struct kevent {
* data/hint flags for EVFILT_{READ|WRITE}, shared with userspace * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
*/ */
#define NOTE_LOWAT 0x0001 /* low water mark */ #define NOTE_LOWAT 0x0001 /* low water mark */
#define NOTE_FILE_POLL 0x0002 /* behave like poll() */
/* /*
* data/hint flags for EVFILT_VNODE, shared with userspace * data/hint flags for EVFILT_VNODE, shared with userspace