mwrap (Perl version) user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: mwrap-perl@80x24.org
Subject: [PATCH 02/19] introduce AUTO_FREE macro to simplify cleanup
Date: Thu, 15 Dec 2022 20:52:38 +0000	[thread overview]
Message-ID: <20221215205255.27840-3-e@80x24.org> (raw)
In-Reply-To: <20221215205255.27840-1-e@80x24.org>

Both gcc and clang have had __attribute__((__cleanup__)) for a
decade or more.  This helps us avoid memory leaks and simplifies
our code.
---
 Mwrap.xs      |  3 +--
 mwrap_core.h  | 14 ++++++++++----
 mwrap_httpd.h | 18 +++++-------------
 3 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/Mwrap.xs b/Mwrap.xs
index 6adf975..9ebc082 100644
--- a/Mwrap.xs
+++ b/Mwrap.xs
@@ -25,7 +25,7 @@ static SV *location_string(struct src_loc *l)
 			sv_catpvf(ret, ":%zu", l->lineno);
 	}
 	if (l->bt_len) {
-		char **s = bt_syms(l->bt, l->bt_len);
+		AUTO_FREE char **s = bt_syms(l->bt, l->bt_len);
 		if (s) {
 			if (l->f)
 				sv_catpvs(ret, "\n");
@@ -33,7 +33,6 @@ static SV *location_string(struct src_loc *l)
 			for (uint32_t i = 1; i < l->bt_len; ++i)
 				sv_catpvf(ret, "\n%s", s[i]);
 		}
-		free(s);
 	}
 	return ret;
 }
diff --git a/mwrap_core.h b/mwrap_core.h
index ec08ee1..2ef550a 100644
--- a/mwrap_core.h
+++ b/mwrap_core.h
@@ -714,6 +714,14 @@ char **bt_syms(void * const *addrlist, uint32_t size)
 	return s;
 }
 
+/* supported by modern gcc + clang */
+#define AUTO_FREE __attribute__((__cleanup__(cleanup_free)))
+static void cleanup_free(void *any)
+{
+	void **p = any;
+	free(*p);
+}
+
 static void *dump_to_file(struct dump_arg *a)
 {
 	struct cds_lfht_iter iter;
@@ -730,13 +738,11 @@ static void *dump_to_file(struct dump_arg *a)
 		if (l->total <= a->min) continue;
 
 		if (loc_is_addr(l)) {
-			char **s = bt_syms(l->bt, 1);
+			AUTO_FREE char **s = bt_syms(l->bt, 1);
 
-			if (s) {
+			if (s)
 				fprintf(a->fp, "%16zu %12zu %s\n",
 					l->total, l->allocations, s[0]);
-				free(s);
-			}
 		} else {
 			fprintf(a->fp, "%16zu %12zu %s:%zu\n",
 				l->total, l->allocations, l->f->fn, l->lineno);
diff --git a/mwrap_httpd.h b/mwrap_httpd.h
index aa4574a..1f706ea 100644
--- a/mwrap_httpd.h
+++ b/mwrap_httpd.h
@@ -420,7 +420,7 @@ static off_t write_loc_name(FILE *fp, const struct src_loc *l)
 			fprintf(fp, ":%zu", l->lineno);
 	}
 	if (l->bt_len) {
-		char **s = bt_syms(l->bt, l->bt_len);
+		AUTO_FREE char **s = bt_syms(l->bt, l->bt_len);
 		if (!s) return -1;
 		if (l->f) fputc('\n', fp);
 
@@ -436,7 +436,6 @@ static off_t write_loc_name(FILE *fp, const struct src_loc *l)
 			fputc('\n', fp);
 			fputs(s[i], fp);
 		}
-		free(s);
 	}
 	off_t end = ftello(fp);
 	if (end < 0) {
@@ -560,14 +559,12 @@ static enum mw_qev each_gt(struct mw_h1 *h1, struct mw_h1req *h1r,
 	struct mw_membuf ln;
 	FILE *lp = memstream_new(&ln);
 	if (!lp) return h1_close(h1);
-	struct h1_src_loc *hslv = accumulate(min, &hslc, lp);
+	AUTO_FREE struct h1_src_loc *hslv = accumulate(min, &hslc, lp);
 	if (!hslv)
 		return h1_close(h1);
 
-	if (err_close(lp)) {
-		free(hslv);
+	if (err_close(lp))
 		return h1_close(h1);
-	}
 
 	char *n = ln.ptr;
 	for (size_t i = 0; i < hslc; ++i) {
@@ -575,7 +572,6 @@ static enum mw_qev each_gt(struct mw_h1 *h1, struct mw_h1req *h1r,
 		n += hslv[i].lname_len;
 		if (hslv[i].lname_len < 0) {
 			free(ln.ptr);
-			free(hslv);
 			return h1_close(h1);
 		}
 	}
@@ -628,7 +624,6 @@ static enum mw_qev each_gt(struct mw_h1 *h1, struct mw_h1req *h1r,
 		write_html(fp, hsl->loc_name, hsl->lname_len);
 		FPUTS("</a></td></tr>", fp);
 	}
-	free(hslv);
 	free(ln.ptr);
 	FPUTS("</table></body></html>", fp);
 	return h1_200(h1, fp, &mb);
@@ -1041,7 +1036,6 @@ static void *h1d_run(void *x) /* pthread_create cb */
 {
 	struct mw_h1d *h1d = x;
 	nfds_t i, nfds;
-	struct pollfd *pfd;
 	int rc;
 	struct mw_h1 *h1, *nxt;
 	enum mw_qev ev;
@@ -1053,7 +1047,7 @@ static void *h1d_run(void *x) /* pthread_create cb */
 		cds_list_for_each_entry_safe(h1, nxt, &h1d->conn, nd)
 			if (poll_add(h1d, h1->fd, h1->events))
 				h1_close(h1);
-		pfd = poll_detach(h1d, &nfds);
+		AUTO_FREE struct pollfd *pfd = poll_detach(h1d, &nfds);
 		rc = pfd ? poll(pfd, nfds, -1) : -1;
 
 		if (rc < 0) {
@@ -1083,10 +1077,8 @@ static void *h1d_run(void *x) /* pthread_create cb */
 				}
 			}
 		}
-		free(pfd);
 	}
-	pfd = poll_detach(h1d, &nfds);
-	free(pfd);
+	free(poll_detach(h1d, &nfds));
 	cds_list_for_each_entry_safe(h1, nxt, &h1d->conn, nd)
 		h1_close(h1);
 	return NULL;

  parent reply	other threads:[~2022-12-15 20:52 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-15 20:52 [PATCH 00/19] another round of httpd improvements Eric Wong
2022-12-15 20:52 ` [PATCH 01/19] mwrap_httpd: show current bytes consistently Eric Wong
2022-12-15 20:52 ` Eric Wong [this message]
2022-12-15 20:52 ` [PATCH 03/19] httpd: rework httpd to use auto-free for memstream Eric Wong
2022-12-15 20:52 ` [PATCH 04/19] httpd: avoid newline if not using bt: >= 1 Eric Wong
2022-12-15 20:52 ` [PATCH 05/19] mwrap_httpd: flesh out /$PID/ and /$PID/trim endpoints Eric Wong
2022-12-15 20:52 ` [PATCH 06/19] mwrap_httpd: add info about src_file and src_loc stats Eric Wong
2022-12-15 20:52 ` [PATCH 07/19] use uatomic_inc where appropriate Eric Wong
2022-12-15 20:52 ` [PATCH 08/19] httpd: drop unnecessary AND ops from base-64 Eric Wong
2022-12-15 20:52 ` [PATCH 09/19] mymalloc: add notes on the malloc implementation Eric Wong
2022-12-15 20:52 ` [PATCH 10/19] rproxy: link to mwrap_httpd /$PID/ root without each, too Eric Wong
2022-12-15 20:52 ` [PATCH 11/19] httpd: shrink `mean_life' field to `double' Eric Wong
2022-12-15 20:52 ` [PATCH 12/19] httpd: support CSV output Eric Wong
2022-12-15 20:52 ` [PATCH 13/19] rproxy: enable deflater by default Eric Wong
2022-12-15 20:52 ` [PATCH 14/19] mwrap_httpd: do not abort on fork if out-of-resources Eric Wong
2022-12-15 20:52 ` [PATCH 15/19] httpd: pause forking thread on resource limitations Eric Wong
2022-12-15 20:52 ` [PATCH 16/19] rename mwrap_httpd.h to httpd.h Eric Wong
2022-12-15 20:52 ` [PATCH 17/19] httpd: describe simple and naive buffering scheme Eric Wong
2022-12-15 20:52 ` [PATCH 18/19] httpd: drop TODO item for pipelining Eric Wong
2022-12-15 20:52 ` [PATCH 19/19] avoid -Warray-bounds warning, avoid stack overallocation Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221215205255.27840-3-e@80x24.org \
    --to=e@80x24.org \
    --cc=mwrap-perl@80x24.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mwrap-perl.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).