Print this page
8634 epoll fails to wake on certain edge-triggered conditions
8635 epoll should not emit POLLNVAL
8636 recursive epoll should emit EPOLLRDNORM
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Igor Kozhukhov <igor@dilos.org>
*** 19,28 ****
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
*/
#include <sys/types.h>
#include <sys/t_lock.h>
#include <sys/param.h>
*** 1092,1120 ****
* Check for errors
*/
if (so->so_error != 0 &&
((POLLIN|POLLRDNORM|POLLOUT) & origevents) != 0) {
*reventsp = (POLLIN|POLLRDNORM|POLLOUT) & origevents;
! return (0);
}
*reventsp = 0;
/*
! * Don't mark socket as writable until TX queued data is
! * below watermark.
*/
! if (so->so_type == SOCK_STREAM) {
! if (sdp_polldata(
! (struct sdp_conn_struct_t *)so->so_proto_handle,
SDP_XMIT)) {
*reventsp |= POLLOUT & events;
}
- } else {
- *reventsp = 0;
- goto done;
- }
if (sdp_polldata((struct sdp_conn_struct_t *)so->so_proto_handle,
SDP_READ)) {
*reventsp |= (POLLIN|POLLRDNORM) & events;
}
--- 1093,1117 ----
* Check for errors
*/
if (so->so_error != 0 &&
((POLLIN|POLLRDNORM|POLLOUT) & origevents) != 0) {
*reventsp = (POLLIN|POLLRDNORM|POLLOUT) & origevents;
! goto done;
}
*reventsp = 0;
+ if (so->so_type != SOCK_STREAM) {
+ goto done;
+ }
/*
! * Don't mark socket writable until TX queued data is below watermark.
*/
! if (sdp_polldata((struct sdp_conn_struct_t *)so->so_proto_handle,
SDP_XMIT)) {
*reventsp |= POLLOUT & events;
}
if (sdp_polldata((struct sdp_conn_struct_t *)so->so_proto_handle,
SDP_READ)) {
*reventsp |= (POLLIN|POLLRDNORM) & events;
}
*** 1122,1132 ****
if ((so_state & SS_CANTRCVMORE) || (so->so_acceptq_len > 0)) {
*reventsp |= (POLLIN|POLLRDNORM) & events;
}
done:
! if (!*reventsp && !anyyet) {
*phpp = &so->so_poll_list;
}
return (0);
}
--- 1119,1129 ----
if ((so_state & SS_CANTRCVMORE) || (so->so_acceptq_len > 0)) {
*reventsp |= (POLLIN|POLLRDNORM) & events;
}
done:
! if ((*reventsp == 0 && !anyyet) || (events & POLLET)) {
*phpp = &so->so_poll_list;
}
return (0);
}