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); }