Module Name: src Committed By: rillig Date: Sat Jun 11 17:58:15 UTC 2022
Modified Files: src/usr.bin/make: parse.c Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.678 -r1.679 src/usr.bin/make/parse.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/parse.c diff -u src/usr.bin/make/parse.c:1.678 src/usr.bin/make/parse.c:1.679 --- src/usr.bin/make/parse.c:1.678 Sat Jun 11 17:41:35 2022 +++ src/usr.bin/make/parse.c Sat Jun 11 17:58:15 2022 @@ -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 while (!Lst_IsEmpty(&targetNames)) { char *targName = Lst_Dequeue(&targetNames); HandleSingleDependencyTargetMundane(targName); - /* TODO: free targName */ + free(targName); } } else HandleSingleDependencyTargetMundane(targetName);