From: Willy Tarreau Date: Tue, 6 Apr 2021 16:09:06 +0000 (+0200) Subject: MINOR: fd: move .exported into fdtab[].state X-Git-Tag: v2.4-dev16~21 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9063a660cc743d3cff76e23c9632522518c49227;p=thirdparty%2Fhaproxy.git MINOR: fd: move .exported into fdtab[].state No need to keep this flag apart any more, let's merge it into the global state. --- diff --git a/include/haproxy/fd-t.h b/include/haproxy/fd-t.h index e60f3b52fb..9108b4ea42 100644 --- a/include/haproxy/fd-t.h +++ b/include/haproxy/fd-t.h @@ -67,6 +67,7 @@ enum { #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) */ #define FD_ET_POSSIBLE_BIT 19 /* edge-triggered is possible on this FD */ +#define FD_EXPORTED_BIT 20 /* FD is exported and must not be closed */ /* and flag values */ @@ -105,6 +106,7 @@ enum { #define FD_CLONED (1U << FD_CLONED_BIT) #define FD_INITIALIZED (1U << FD_INITIALIZED_BIT) #define FD_ET_POSSIBLE (1U << FD_ET_POSSIBLE_BIT) +#define FD_EXPORTED (1U << FD_EXPORTED_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 @@ -153,7 +155,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 exported:1; /* 1 if the FD is exported and must not be closed */ #ifdef DEBUG_FD unsigned int event_count; /* number of events reported */ #endif diff --git a/include/haproxy/fd.h b/include/haproxy/fd.h index ba9bf8c222..37c9ac5362 100644 --- a/include/haproxy/fd.h +++ b/include/haproxy/fd.h @@ -433,7 +433,6 @@ static inline void fd_insert(int fd, void *owner, void (*iocb)(int fd), unsigned fdtab[fd].owner = owner; fdtab[fd].iocb = iocb; fdtab[fd].state = 0; - fdtab[fd].exported = 0; #ifdef DEBUG_FD fdtab[fd].event_count = 0; #endif diff --git a/src/cli.c b/src/cli.c index 08c35da0f3..575a1730ea 100644 --- a/src/cli.c +++ b/src/cli.c @@ -1889,7 +1889,7 @@ static int _getsocks(char **args, char *payload, struct appctx *appctx, void *pr * the caller know how much it should expect. */ for (cur_fd = 0;cur_fd < global.maxsock; cur_fd++) - tot_fd_nb += fdtab[cur_fd].exported; + tot_fd_nb += !!(fdtab[cur_fd].state & FD_EXPORTED); if (tot_fd_nb == 0) goto out; @@ -1933,7 +1933,7 @@ static int _getsocks(char **args, char *payload, struct appctx *appctx, void *pr nb_queued = 0; iov.iov_base = tmpbuf; for (cur_fd = 0; cur_fd < global.maxsock; cur_fd++) { - if (!(fdtab[cur_fd].exported)) + if (!(fdtab[cur_fd].state & FD_EXPORTED)) continue; ns_name = if_name = ""; diff --git a/src/fd.c b/src/fd.c index fe9db237c4..d63abbf54b 100644 --- a/src/fd.c +++ b/src/fd.c @@ -320,7 +320,6 @@ void _fd_delete_orphan(int fd) #endif fdinfo[fd].port_range = NULL; fdtab[fd].owner = NULL; - fdtab[fd].exported = 0; /* perform the close() call last as it's what unlocks the instant reuse * of this FD by any other thread. */ diff --git a/src/sock_inet.c b/src/sock_inet.c index ab881d8696..fb6998143f 100644 --- a/src/sock_inet.c +++ b/src/sock_inet.c @@ -395,7 +395,7 @@ int sock_inet_bind_receiver(struct receiver *rx, char **errmsg) /* for now, all regularly bound TCP listeners are exportable */ if (!(rx->flags & RX_F_INHERITED)) - fdtab[fd].exported = 1; + HA_ATOMIC_OR(&fdtab[fd].state, FD_EXPORTED); bind_return: if (errmsg && *errmsg) { diff --git a/src/sock_unix.c b/src/sock_unix.c index 45631ac17a..9913f4f838 100644 --- a/src/sock_unix.c +++ b/src/sock_unix.c @@ -289,7 +289,7 @@ int sock_unix_bind_receiver(struct receiver *rx, char **errmsg) /* for now, all regularly bound TCP listeners are exportable */ if (!(rx->flags & RX_F_INHERITED)) - fdtab[fd].exported = 1; + HA_ATOMIC_OR(&fdtab[fd].state, FD_EXPORTED); return err;