diff options
| author | rillig <rillig@NetBSD.org> | 2022-06-11 17:58:15 +0000 |
|---|---|---|
| committer | rillig <rillig@NetBSD.org> | 2022-06-11 17:58:15 +0000 |
| commit | 031fec0a1457033d4ef46b548bfb9308a2222212 (patch) | |
| tree | 761643251e4cbb9b6771a1ceba9adafcc576ff57 /usr.bin/make/parse.c | |
| parent | b3f0b1c708c727243c90f04fb4f6bd55dbeefdb4 (diff) | |
make: fix memory leak in wildcard targets and sources
$ cat <<'EOF' > glob-leak.mk
all:
@pid=$$$$; \
ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \
ps -o vsz,rsz -p $$ppid | sed 1d
.for _ in ${:U:${:Urange=$n}}
bin/*: source
.endfor
EOF
$ make.before -r -f glob-leak.mk n=1
19424 5280
$ make.before -r -f glob-leak.mk n=10
24220 10208
$ make.before -r -f glob-leak.mk n=100
71280 58504
$ make.before -r -f glob-leak.mk n=1000
556356 541620
$ make.after -r -f glob-leak.mk n=1
19208 5040
$ make.after -r -f glob-leak.mk n=10
22132 8092
$ make.after -r -f glob-leak.mk n=100
49040 35940
$ make.after -r -f glob-leak.mk n=1000
324160 314400
That's a saving of 40% already. The remaining 60% are suspicious as
well since after the first iteration of the .for loop, make's internal
state doesn't change conceptually, so there's no need to throw more
memory at it.
Diffstat (limited to 'usr.bin/make/parse.c')
| -rw-r--r-- | usr.bin/make/parse.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c index c00be485ab7..65ea9a5e522 100644 --- a/usr.bin/make/parse.c +++ b/usr.bin/make/parse.c @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.678 2022/06/11 17:41:35 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.679 2022/06/11 17:58:15 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -105,7 +105,7 @@ #include "pathnames.h" /* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: parse.c,v 1.678 2022/06/11 17:41:35 rillig Exp $"); +MAKE_RCSID("$NetBSD: parse.c,v 1.679 2022/06/11 17:58:15 rillig Exp $"); /* * A file being read. @@ -1045,7 +1045,7 @@ HandleDependencyTargetMundane(const char *targetName) while (!Lst_IsEmpty(&targetNames)) { char *targName = Lst_Dequeue(&targetNames); HandleSingleDependencyTargetMundane(targName); - /* TODO: free targName */ + free(targName); } } else HandleSingleDependencyTargetMundane(targetName); |
