Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make make(1): initialize and free GNode fields in de...
details: https://anonhg.NetBSD.org/src/rev/e868e95d6e61
branches: trunk
changeset: 946117:e868e95d6e61
user: rillig <rillig%NetBSD.org@localhost>
date: Mon Nov 16 22:27:03 2020 +0000
description:
make(1): initialize and free GNode fields in declaration order
Initialization and destruction of the fields is independent from the
other fields. Therefore use declaration order, which allows to quickly
see whether a field was forgotten.
While here, add comments that in cleanup mode, not all memory is freed.
The variables of a node and the suffix survive right now.
diffstat:
usr.bin/make/targ.c | 45 +++++++++++++++++++++++++--------------------
1 files changed, 25 insertions(+), 20 deletions(-)
diffs (81 lines):
diff -r 25fa4cd25898 -r e868e95d6e61 usr.bin/make/targ.c
--- a/usr.bin/make/targ.c Mon Nov 16 22:08:20 2020 +0000
+++ b/usr.bin/make/targ.c Mon Nov 16 22:27:03 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: targ.c,v 1.133 2020/11/16 21:59:08 rillig Exp $ */
+/* $NetBSD: targ.c,v 1.134 2020/11/16 22:27:03 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -119,7 +119,7 @@
#include "dir.h"
/* "@(#)targ.c 8.2 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: targ.c,v 1.133 2020/11/16 21:59:08 rillig Exp $");
+MAKE_RCSID("$NetBSD: targ.c,v 1.134 2020/11/16 22:27:03 rillig Exp $");
/* All target nodes found so far, but not the source nodes. */
static GNodeList *allTargets;
@@ -193,21 +193,21 @@
gn->uname = NULL;
gn->path = NULL;
gn->type = name[0] == '-' && name[1] == 'l' ? OP_LIB : 0;
+ gn->flags = 0;
+ gn->made = UNMADE;
gn->unmade = 0;
- gn->unmade_cohorts = 0;
- gn->cohort_num[0] = '\0';
- gn->centurion = NULL;
- gn->made = UNMADE;
- gn->flags = 0;
- gn->checked_seqno = 0;
gn->mtime = 0;
gn->youngestChild = NULL;
gn->implicitParents = Lst_New();
- gn->cohorts = Lst_New();
gn->parents = Lst_New();
gn->children = Lst_New();
gn->order_pred = Lst_New();
gn->order_succ = Lst_New();
+ gn->cohorts = Lst_New();
+ gn->cohort_num[0] = '\0';
+ gn->unmade_cohorts = 0;
+ gn->centurion = NULL;
+ gn->checked_seqno = 0;
HashTable_Init(&gn->context);
gn->commands = Lst_New();
gn->suffix = NULL;
@@ -230,17 +230,22 @@
free(gn->name);
free(gn->uname);
free(gn->path);
-
- Lst_Free(gn->implicitParents);
- Lst_Free(gn->cohorts);
- Lst_Free(gn->parents);
- Lst_Free(gn->children);
- Lst_Free(gn->order_succ);
- Lst_Free(gn->order_pred);
- HashTable_Done(&gn->context);
- Lst_Free(gn->commands);
-
- /* XXX: does gn->suffix need to be freed? It is reference-counted. */
+ /* gn->youngestChild is not owned by this node. */
+ Lst_Free(gn->implicitParents); /* ... but not the nodes themselves, */
+ Lst_Free(gn->parents); /* as they are not owned by this node. */
+ Lst_Free(gn->children); /* likewise */
+ Lst_Free(gn->order_pred); /* likewise */
+ Lst_Free(gn->order_succ); /* likewise */
+ Lst_Free(gn->cohorts); /* likewise */
+ HashTable_Done(&gn->context); /* ... but not the variables themselves,
+ * even though they are owned by this node.
+ * XXX: they should probably be freed. */
+ Lst_Free(gn->commands); /* ... but not the commands themselves,
+ * as they may be shared with other nodes. */
+ /* gn->suffix is not owned by this node. */
+ /* XXX: gn->suffix should be unreferenced here. This requires a thorough
+ * check that the reference counting is done correctly in all places,
+ * otherwise a suffix might be freed too early. */
free(gn);
}
Home |
Main Index |
Thread Index |
Old Index