MINOR: server: return the next srv instance on free_server

As a convenience, return the next server instance from servers list on
free_server.

This is particularily useful when using this function on the servers
list without having to save of the next pointer before calling it.
This commit is contained in:
Amaury Denoyelle 2021-08-25 15:03:46 +02:00
parent cd61e8383d
commit f5c1e12e44
3 changed files with 16 additions and 8 deletions

View File

@ -59,7 +59,7 @@ int srv_set_addr_via_libc(struct server *srv, int *err_code);
int srv_init_addr(void); int srv_init_addr(void);
struct server *cli_find_server(struct appctx *appctx, char *arg); struct server *cli_find_server(struct appctx *appctx, char *arg);
struct server *new_server(struct proxy *proxy); struct server *new_server(struct proxy *proxy);
void free_server(struct server *srv); struct server *free_server(struct server *srv);
int srv_init_per_thr(struct server *srv); int srv_init_per_thr(struct server *srv);
/* functions related to server name resolution */ /* functions related to server name resolution */

View File

@ -130,7 +130,7 @@ static void free_stick_rules(struct list *rules)
void free_proxy(struct proxy *p) void free_proxy(struct proxy *p)
{ {
struct server *s,*s_next; struct server *s;
struct cap_hdr *h,*h_next; struct cap_hdr *h,*h_next;
struct listener *l,*l_next; struct listener *l,*l_next;
struct bind_conf *bind_conf, *bind_back; struct bind_conf *bind_conf, *bind_back;
@ -289,11 +289,9 @@ void free_proxy(struct proxy *p)
s = p->srv; s = p->srv;
while (s) { while (s) {
s_next = s->next;
list_for_each_entry(srvdf, &server_deinit_list, list) list_for_each_entry(srvdf, &server_deinit_list, list)
srvdf->fct(s); srvdf->fct(s);
free_server(s); s = free_server(s);
s = s_next;
}/* end while(s) */ }/* end while(s) */
list_for_each_entry_safe(l, l_next, &p->conf.listeners, by_fe) { list_for_each_entry_safe(l, l_next, &p->conf.listeners, by_fe) {

View File

@ -2213,11 +2213,18 @@ static uint srv_release_dynsrv(struct server *srv)
/* Deallocate a server <srv> and its member. <srv> must be allocated. For /* Deallocate a server <srv> and its member. <srv> must be allocated. For
* dynamic servers, its refcount is decremented first. The free operations are * dynamic servers, its refcount is decremented first. The free operations are
* conducted only if the refcount is nul, unless the process is stopping. * conducted only if the refcount is nul, unless the process is stopping.
*
* As a convenience, <srv.next> is returned if srv is not NULL. It may be useful
* when calling free_server on the list of servers.
*/ */
void free_server(struct server *srv) struct server *free_server(struct server *srv)
{ {
struct server *next = NULL;
if (!srv) if (!srv)
return; goto end;
next = srv->next;
/* For dynamic servers, decrement the reference counter. Only free the /* For dynamic servers, decrement the reference counter. Only free the
* server when reaching zero. * server when reaching zero.
@ -2225,7 +2232,7 @@ void free_server(struct server *srv)
if (likely(!(global.mode & MODE_STOPPING))) { if (likely(!(global.mode & MODE_STOPPING))) {
if (srv->flags & SRV_F_DYNAMIC) { if (srv->flags & SRV_F_DYNAMIC) {
if (srv_release_dynsrv(srv)) if (srv_release_dynsrv(srv))
return; goto end;
} }
} }
@ -2255,6 +2262,9 @@ void free_server(struct server *srv)
free(srv); free(srv);
srv = NULL; srv = NULL;
end:
return next;
} }
/* Remove a server <srv> from a tracking list if <srv> is tracking another /* Remove a server <srv> from a tracking list if <srv> is tracking another