mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-21 22:01:31 +02:00
MINOR: fd: add two flags ERR and SHUT to describe FD states
There's currently a big ambiguity on our use of POLLHUP because we currently map POLLHUP and POLLRDHUP to FD_POLL_HUP. The first one indicates a close in *both* directions while the second one indicates a unidirectional close. Since we don't know from the resulting flag we always have to read when reported. Furthermore kqueue only reports unidirectional responses which are mapped to FD_POLL_HUP as well, and their write closes are mapped to a general error. We could add a new FD_POLL_RDHUP flag to improve the mapping, or switch only to the POLL* flags, but that further complicates the portability for operating systems like FreeBSD which do not have POLLRDHUP but have its semantics. Let's instead directly use the per-direction flag values we already have, and it will be a first step in the direction of finer states. Thus we introduce an ERR and a SHUT status for each direction, that the pollers will be able to compute and pass to fd_update_events(). It's worth noting that FD_EV_STATUS already sees the two new flags, but they are harmless since used only by fd_{recv,send}_state() which are never called. Thus in its current state this patch must be totally transparent.
This commit is contained in:
parent
ccf3f6d1d6
commit
77abb43ed1
@ -50,15 +50,21 @@ enum {
|
||||
/* FD bits used for different polling states in each direction */
|
||||
#define FD_EV_ACTIVE 1U
|
||||
#define FD_EV_READY 2U
|
||||
#define FD_EV_SHUT 4U
|
||||
#define FD_EV_ERR 8U
|
||||
|
||||
/* bits positions for a few flags */
|
||||
#define FD_EV_ACTIVE_R_BIT 0
|
||||
#define FD_EV_READY_R_BIT 1
|
||||
#define FD_EV_READY_R_BIT 1
|
||||
#define FD_EV_SHUT_R_BIT 2
|
||||
#define FD_EV_ERR_R_BIT 3
|
||||
|
||||
#define FD_EV_ACTIVE_W_BIT 4
|
||||
#define FD_EV_READY_W_BIT 5
|
||||
#define FD_EV_READY_W_BIT 5
|
||||
#define FD_EV_SHUT_W_BIT 6
|
||||
#define FD_EV_ERR_W_BIT 7
|
||||
|
||||
#define FD_EV_STATUS (FD_EV_ACTIVE | FD_EV_READY)
|
||||
#define FD_EV_STATUS (FD_EV_ACTIVE | FD_EV_READY | FD_EV_SHUT | FD_EV_ERR)
|
||||
#define FD_EV_STATUS_R (FD_EV_STATUS)
|
||||
#define FD_EV_STATUS_W (FD_EV_STATUS << 4)
|
||||
|
||||
@ -70,6 +76,16 @@ enum {
|
||||
#define FD_EV_READY_W (FD_EV_READY << 4)
|
||||
#define FD_EV_READY_RW (FD_EV_READY_R | FD_EV_READY_W)
|
||||
|
||||
/* note that when FD_EV_SHUT is set, ACTIVE and READY are cleared */
|
||||
#define FD_EV_SHUT_R (FD_EV_SHUT)
|
||||
#define FD_EV_SHUT_W (FD_EV_SHUT << 4)
|
||||
#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 (FD_EV_ERR)
|
||||
#define FD_EV_ERR_W (FD_EV_ERR << 4)
|
||||
#define FD_EV_ERR_RW (FD_EV_ERR_R | FD_EV_ERR_W)
|
||||
|
||||
|
||||
/* This is the value used to mark a file descriptor as dead. This value is
|
||||
* negative, this is important so that tests on fd < 0 properly match. It
|
||||
|
Loading…
x
Reference in New Issue
Block a user