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>

@@ -23,11 +23,11 @@
  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 /*
- * Copyright (c) 2014, Joyent, Inc. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
  */
 
 /*
  * av1394 asynchronous module
  */

@@ -348,27 +348,29 @@
 
         AV1394_TNF_EXIT(av1394_async_ioctl);
         return (ret);
 }
 
-/*ARGSUSED*/
 int
 av1394_async_poll(av1394_inst_t *avp, short events, int anyyet, short *reventsp,
                 struct pollhead **phpp)
 {
         av1394_async_t  *ap = &avp->av_a;
         av1394_queue_t  *rq = &ap->a_rq;
 
         AV1394_TNF_ENTER(av1394_async_poll);
 
-        if (events & POLLIN) {
-                if (av1394_peekq(rq))
+        if (events & (POLLIN | POLLET)) {
+                if ((events & POLLIN) && av1394_peekq(rq)) {
                         *reventsp |= POLLIN;
+                }
 
                 if ((!*reventsp && !anyyet) || (events & POLLET)) {
                         mutex_enter(&ap->a_mutex);
+                        if (events & POLLIN) {
                         ap->a_pollevents |= POLLIN;
+                        }
                         *phpp = &ap->a_pollhead;
                         mutex_exit(&ap->a_mutex);
                 }
         }