From: Willy Tarreau Date: Tue, 6 Apr 2021 15:57:12 +0000 (+0200) Subject: MINOR: fd: move .initialized into fdtab[].state X-Git-Tag: v2.4-dev16~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0cc612818d05c2b4f884c03094cf2858e4389827;p=thirdparty%2Fhaproxy.git MINOR: fd: move .initialized into fdtab[].state No need to keep this flag apart any more, let's merge it into the global state. The bit was not cleared in fd_insert() because the only user is the function used to create and atomically send a log message to a pipe FD, which never registers the fd. Here we clear it nevertheless for the sake of clarity. Note that with an extra cleaning pass we could have a bit number here and simply use a BTS to test and set it. --- diff --git a/include/haproxy/fd-t.h b/include/haproxy/fd-t.h index 1f55840063..cfcde398b2 100644 --- a/include/haproxy/fd-t.h +++ b/include/haproxy/fd-t.h @@ -65,6 +65,7 @@ enum { /* info/config bits */ #define FD_LINGER_RISK_BIT 16 /* must kill lingering before closing */ #define FD_CLONED_BIT 17 /* cloned socket, requires EPOLL_CTL_DEL on close */ +#define FD_INITIALIZED_BIT 18 /* init phase was done (e.g. output pipe set non-blocking) */ /* and flag values */ @@ -101,6 +102,7 @@ enum { /* information/configuration flags */ #define FD_LINGER_RISK (1U << FD_LINGER_RISK_BIT) #define FD_CLONED (1U << FD_CLONED_BIT) +#define FD_INITIALIZED (1U << FD_INITIALIZED_BIT) /* 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 @@ -149,7 +151,6 @@ struct fdtab { void (*iocb)(int fd); /* I/O handler */ void *owner; /* the connection or listener associated with this fd, NULL if closed */ unsigned int state; /* FD state for read and write directions (FD_EV_*) + FD_POLL_* */ - unsigned char initialized:1; /* 1 if init phase was done on this fd (e.g. set non-blocking) */ unsigned char et_possible:1; /* 1 if edge-triggered is possible on this FD */ unsigned char exported:1; /* 1 if the FD is exported and must not be closed */ #ifdef DEBUG_FD diff --git a/src/fd.c b/src/fd.c index 64e4e9cc0e..fe9db237c4 100644 --- a/src/fd.c +++ b/src/fd.c @@ -514,8 +514,8 @@ ssize_t fd_write_frag_line(int fd, size_t maxlen, const struct ist pfx[], size_t ha_thread_relax(); } - if (unlikely(!fdtab[fd].initialized)) { - fdtab[fd].initialized = 1; + if (unlikely(!(fdtab[fd].state & FD_INITIALIZED))) { + HA_ATOMIC_OR(&fdtab[fd].state, FD_INITIALIZED); if (!isatty(fd)) fcntl(fd, F_SETFL, O_NONBLOCK); }