"GOT", but the "O" is a cute, smiling sun Index | Thread

From:
Stefan Sperling <stsp@stsp.name>
Subject:
gotwebd address list head allocation
To:
gameoftrees@openbsd.org
Date:
Tue, 16 Aug 2022 14:15:54 +0200

Download raw body.

gotwebd allocates address list heads separately, which is unnecessary.
We only use one such head per struct server / struct server_conf.
we can simply inline storage for address list heads in the structs
which contain them.

ok?
 
diff 438d0cc30baf8e97fd870f5e620833e0a45401aa 88c5bf1c3e717fe3504086f83b75f15e985bc22f
commit - 438d0cc30baf8e97fd870f5e620833e0a45401aa
commit + 88c5bf1c3e717fe3504086f83b75f15e985bc22f
blob - b58b1e7be0421dac9ff6c9717bacb59208ad1bbb
blob + 2d740d8c68ee194fe07fbfdcd32adc917ba70b44
--- gotwebd/gotwebd.h
+++ gotwebd/gotwebd.h
@@ -252,7 +252,7 @@ TAILQ_HEAD(addresslist, address);
 
 struct server {
 	TAILQ_ENTRY(server)	 entry;
-	struct addresslist	*al;
+	struct addresslist	al;
 
 	char		 name[GOTWEBD_MAXTEXT];
 
@@ -294,7 +294,7 @@ enum sock_type {
 };
 
 struct socket_conf {
-	struct addresslist	*al;
+	struct addresslist	al;
 
 	char		 name[GOTWEBD_MAXTEXT];
 	char		 srv_name[GOTWEBD_MAXTEXT];
blob - 748db3ece24e2a35e37196d7d1f2d8f1a3b071c8
blob + 6a19cc971eac7c808d5e66cf765ae45df9f34677
--- gotwebd/parse.y
+++ gotwebd/parse.y
@@ -227,7 +227,7 @@ server		: SERVER STRING {
 			new_srv = conf_new_server($2);
 			if (new_srv->fcgi_socket)
 				if (get_addrs(new_srv->fcgi_socket_bind,
-				    new_srv->al,
+				    &new_srv->al,
 				    new_srv->fcgi_socket_port) == -1) {
 					yyerror("could not get tcp iface "
 					    "addrs");
@@ -252,7 +252,7 @@ server		: SERVER STRING {
 			free($2);
 		} '{' optnl serveropts2 '}' {
 			if (get_addrs(new_srv->fcgi_socket_bind,
-			    new_srv->al, new_srv->fcgi_socket_port) == -1) {
+			    &new_srv->al, new_srv->fcgi_socket_port) == -1) {
 				yyerror("could not get tcp iface addrs");
 				YYERROR;
 			}
@@ -934,10 +934,7 @@ conf_new_server(const char *name)
 	srv->unix_socket = 1;
 	srv->fcgi_socket = gotwebd->fcgi_socket ? gotwebd->fcgi_socket : 0;
 
-	if ((srv->al = calloc(1, sizeof(*srv->al))) == NULL)
-		fatalx("%s: calloc", __func__);
-
-	TAILQ_INIT(srv->al);
+	TAILQ_INIT(&srv->al);
 	TAILQ_INSERT_TAIL(gotwebd->servers, srv, entry);
 	gotwebd->server_cnt++;
 
blob - cf2a3d1df8e8ab807643e41c0104908853476046
blob + b60e44674a3b5851bb5126437284adc08abea47d
--- gotwebd/sockets.c
+++ gotwebd/sockets.c
@@ -141,7 +141,7 @@ sockets_parse_sockets(struct gotwebd *env)
 			TAILQ_FOREACH(sock, env->sockets, entry) {
 				ipv4 = ipv6 = 0;
 
-				TAILQ_FOREACH(a, sock->conf.al, entry) {
+				TAILQ_FOREACH(a, &sock->conf.al, entry) {
 					if (a->ss.ss_family == AF_INET)
 						ipv4 = 1;
 					if (a->ss.ss_family == AF_INET6)
@@ -180,14 +180,12 @@ sockets_dup_new_socket(struct socket *p_sock, struct s
 	n = snprintf(sock->conf.name, GOTWEBD_MAXTEXT, "%s_child",
 	    p_sock->conf.srv_name);
 	if (n < 0 || (size_t)n >= GOTWEBD_MAXTEXT) {
-		free(p_sock->conf.al);
 		free(p_sock);
-		free(sock->conf.al);
 		free(sock);
 		fatalx("%s: snprintf", __func__);
 	}
 
-	TAILQ_FOREACH(a, p_sock->conf.al, entry) {
+	TAILQ_FOREACH(a, &p_sock->conf.al, entry) {
 		if (a->ss.ss_family == AF_INET)
 			continue;
 
@@ -205,7 +203,7 @@ sockets_dup_new_socket(struct socket *p_sock, struct s
 			}
 		}
 
-		TAILQ_INSERT_TAIL(sock->conf.al, acp, entry);
+		TAILQ_INSERT_TAIL(&sock->conf.al, acp, entry);
 	}
 }
 
@@ -220,11 +218,7 @@ sockets_conf_new_socket(struct gotwebd *env, struct se
 	if ((sock = calloc(1, sizeof(*sock))) == NULL)
 		fatalx("%s: calloc", __func__);
 
-	if ((sock->conf.al = calloc(1, sizeof(*sock->conf.al))) == NULL) {
-		free(sock);
-		fatalx("%s: calloc", __func__);
-	}
-	TAILQ_INIT(sock->conf.al);
+	TAILQ_INIT(&sock->conf.al);
 
 	sock->conf.parent_id = 0;
 	sock->conf.id = id;
@@ -238,7 +232,6 @@ sockets_conf_new_socket(struct gotwebd *env, struct se
 		    srv->unix_socket_name,
 		    sizeof(sock->conf.unix_socket_name)) >=
 		    sizeof(sock->conf.unix_socket_name)) {
-			free(sock->conf.al);
 			free(sock);
 			fatalx("%s: strlcpy", __func__);
 		}
@@ -253,21 +246,18 @@ sockets_conf_new_socket(struct gotwebd *env, struct se
 	n = snprintf(sock->conf.name, GOTWEBD_MAXTEXT, "%s_parent",
 	    srv->name);
 	if (n < 0 || (size_t)n >= GOTWEBD_MAXTEXT) {
-		free(sock->conf.al);
 		free(sock);
 		fatalx("%s: snprintf", __func__);
 	}
 
 	if (strlcpy(sock->conf.srv_name, srv->name,
 	    sizeof(sock->conf.srv_name)) >= sizeof(sock->conf.srv_name)) {
-		free(sock->conf.al);
 		free(sock);
 		fatalx("%s: strlcpy", __func__);
 	}
 
-	TAILQ_FOREACH(a, srv->al, entry) {
+	TAILQ_FOREACH(a, &srv->al, entry) {
 		if ((acp = calloc(1, sizeof(*acp))) == NULL) {
-			free(sock->conf.al);
 			free(sock);
 			fatal("%s: calloc", __func__);
 		}
@@ -283,7 +273,7 @@ sockets_conf_new_socket(struct gotwebd *env, struct se
 			}
 		}
 
-		TAILQ_INSERT_TAIL(sock->conf.al, acp, entry);
+		TAILQ_INSERT_TAIL(&sock->conf.al, acp, entry);
 	}
 done:
 	return (sock);
@@ -437,7 +427,7 @@ sockets_privinit(struct gotwebd *env, struct socket *s
 	if (sock->conf.type == FCGI) {
 		log_debug("%s: initializing fcgi socket for %s", __func__,
 		    sock->conf.name);
-		sock->fd = sockets_create_socket(sock->conf.al,
+		sock->fd = sockets_create_socket(&sock->conf.al,
 		    sock->conf.fcgi_socket_port);
 		if (sock->fd == -1) {
 			log_warnx("%s: create unix socket failed", __func__);