((evts & FD_EV_READY_R) ? FD_POLL_IN : 0) |
((evts & FD_EV_READY_W) ? FD_POLL_OUT : 0) |
((evts & FD_EV_SHUT_R) ? FD_POLL_HUP : 0) |
- ((evts & FD_EV_ERR_R) ? FD_POLL_ERR : 0) |
- ((evts & FD_EV_ERR_W) ? FD_POLL_ERR : 0);
+ ((evts & FD_EV_ERR_RW) ? FD_POLL_ERR : 0);
/* SHUTW reported while FD was active for writes is an error */
if ((fdtab[fd].ev & FD_EV_ACTIVE_W) && (evts & FD_EV_SHUT_W))
/* both sides stopped */
must_stop = FD_POLL_IN | FD_POLL_OUT;
}
- else if (unlikely(!fd_recv_active(fd) && (evts & (FD_EV_READY_R | FD_EV_SHUT_R | FD_EV_ERR_R)))) {
+ else if (unlikely(!fd_recv_active(fd) && (evts & (FD_EV_READY_R | FD_EV_SHUT_R | FD_EV_ERR_RW)))) {
/* only send remains */
must_stop = FD_POLL_IN;
}
- else if (unlikely(!fd_send_active(fd) && (evts & (FD_EV_READY_W | FD_EV_SHUT_W | FD_EV_ERR_W)))) {
+ else if (unlikely(!fd_send_active(fd) && (evts & (FD_EV_READY_W | FD_EV_SHUT_W | FD_EV_ERR_RW)))) {
/* only recv remains */
must_stop = FD_POLL_OUT;
}
#define FD_EV_ACTIVE_R_BIT 0
#define FD_EV_READY_R_BIT 1
#define FD_EV_SHUT_R_BIT 2
-#define FD_EV_ERR_R_BIT 3
+/* unused: 3 */
#define FD_EV_ACTIVE_W_BIT 4
#define FD_EV_READY_W_BIT 5
#define FD_EV_SHUT_W_BIT 6
-#define FD_EV_ERR_W_BIT 7
+#define FD_EV_ERR_RW_BIT 7
/* and flag values */
#define FD_EV_ACTIVE_R (1U << FD_EV_ACTIVE_R_BIT)
#define FD_EV_SHUT_W (1U << FD_EV_SHUT_W_BIT)
#define FD_EV_SHUT_RW (FD_EV_SHUT_R | FD_EV_SHUT_W)
-/* note that when FD_EV_ERR is set, SHUT is also set */
-#define FD_EV_ERR_R (1U << FD_EV_ERR_R_BIT)
-#define FD_EV_ERR_W (1U << FD_EV_ERR_W_BIT)
-#define FD_EV_ERR_RW (FD_EV_ERR_R | FD_EV_ERR_W)
+/* note that when FD_EV_ERR is set, SHUT is also set. Also, ERR is for both
+ * directions at once (write error, socket dead, etc).
+ */
+#define FD_EV_ERR_RW (1U << FD_EV_ERR_RW_BIT)
/* This is the value used to mark a file descriptor as dead. This value is