Module Name: othersrc
Committed By: dholland
Date: Sat Mar 23 21:27:23 UTC 2013
Modified Files:
othersrc/usr.bin/dholland-make2: make.c
Log Message:
Simplify the toBeMade logic based on the fact that only one group of
non-tail insertions is done at a time, so the insertion point can be
tracked by the queue.
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 othersrc/usr.bin/dholland-make2/make.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: othersrc/usr.bin/dholland-make2/make.c
diff -u othersrc/usr.bin/dholland-make2/make.c:1.9 othersrc/usr.bin/dholland-make2/make.c:1.10
--- othersrc/usr.bin/dholland-make2/make.c:1.9 Sat Mar 23 21:25:31 2013
+++ othersrc/usr.bin/dholland-make2/make.c Sat Mar 23 21:27:23 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: make.c,v 1.9 2013/03/23 21:25:31 dholland Exp $ */
+/* $NetBSD: make.c,v 1.10 2013/03/23 21:27:23 dholland Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -111,14 +111,12 @@
#include "dir.h"
#include "job.h"
-MAKE_RCSID("$NetBSD: make.c,v 1.9 2013/03/23 21:25:31 dholland Exp $");
-
-typedef struct {
- LstNode elem;
-} QPos;
+MAKE_RCSID("$NetBSD: make.c,v 1.10 2013/03/23 21:27:23 dholland Exp $");
typedef struct {
Lst data;
+ Boolean hasmark;
+ LstNode mark;
} MakeQ;
static unsigned int checked = 1;/* Sequence # to detect recursion */
@@ -139,8 +137,8 @@ static Boolean MakeStartJobs(void);
static int MakePrintStatus(GNode *, int *);
static int MakeCheckOrder(GNode *);
static int DoMakeCheckOrder(GList *);
-static int MakeBuildChild(GNode *, QPos *);
-static void MakeBuildParent(GNode *, QPos *);
+static int MakeBuildChild(GNode *, Boolean);
+static void MakeBuildParent(GNode *, Boolean);
////////////////////////////////////////////////////////////
// MakeQ
@@ -149,6 +147,8 @@ static void
MakeQ_Init(MakeQ *q)
{
q->data = Lst_Init(FALSE);
+ q->hasmark = FALSE;
+ q->mark = NULL;
}
static Boolean
@@ -164,41 +164,46 @@ MakeQ_AddTail(MakeQ *q, GNode *gn)
}
static void
-MakeQ_Insert(MakeQ *q, QPos *before, GNode *gn)
-{
- Lst_InsertBefore(q->data, before->elem, gn);
+MakeQ_AddBeforeMark(MakeQ *q, GNode *gn)
+{
+ assert(q->hasmark);
+ if (q->mark == NULL) {
+ Lst_AtEnd(q->data, gn);
+ } else {
+ Lst_InsertBefore(q->data, q->mark, gn);
+ }
}
-static GNode *
-MakeQ_PopHead(MakeQ *q)
+static void
+MakeQ_SetMark(MakeQ *q)
{
- return (GNode *)Lst_DeQueue(q->data);
+ assert(!q->hasmark);
+ q->hasmark = TRUE;
+ if (Lst_IsEmpty(q->data)) {
+ q->mark = NULL;
+ } else {
+ q->mark = Lst_First(q->data);
+ }
}
static void
-MakeQ_ForEach(MakeQ *q, int (*func)(void *, void *), void *ptr)
+MakeQ_ClearMark(MakeQ *q)
{
- Lst_ForEach(q->data, func, ptr);
+ assert(q->hasmark);
+ q->hasmark = FALSE;
+ q->mark = NULL;
}
-static QPos *
-QPos_Create(LstNode elem)
+static GNode *
+MakeQ_PopHead(MakeQ *q)
{
- QPos *ret;
-
- ret = bmake_malloc(sizeof(*ret));
- ret->elem = elem;
- return ret;
+ return (GNode *)Lst_DeQueue(q->data);
}
-static QPos *
-MakeQ_First(MakeQ *q)
+static void
+MakeQ_ForEach(MakeQ *q, int (*func)(void *, void *), void *ptr)
{
- QPos *ret;
-
- // XXX this leaks memory
- ret = QPos_Create(Lst_First(q->data));
- return ret;
+ Lst_ForEach(q->data, func, ptr);
}
////////////////////////////////////////////////////////////
@@ -797,7 +802,9 @@ Make_Update(GNode *cgn)
for (i=0; i<glist_num(¢urion->order_succ); i++) {
succ = glist_get(¢urion->order_succ, i);
- MakeBuildParent(succ, MakeQ_First(&toBeMade));
+ MakeQ_SetMark(&toBeMade);
+ MakeBuildParent(succ, TRUE);
+ MakeQ_ClearMark(&toBeMade);
}
}
@@ -1114,7 +1121,7 @@ DoMakeCheckOrder(GList *order_pred)
}
static int
-MakeBuildChild(GNode *cn, QPos *toBeMade_next)
+MakeBuildChild(GNode *cn, Boolean usemark)
{
if (DEBUG(MAKE))
fprintf(debug_file, "MakeBuildChild: inspect %s%s, made %d, type %x\n",
@@ -1134,16 +1141,16 @@ MakeBuildChild(GNode *cn, QPos *toBeMade
cn->name, cn->cohort_num);
cn->made = REQUESTED;
- if (toBeMade_next == NULL)
+ if (usemark == FALSE)
MakeQ_AddTail(&toBeMade, cn);
else
- MakeQ_Insert(&toBeMade, toBeMade_next, cn);
+ MakeQ_AddBeforeMark(&toBeMade, cn);
if (cn->unmade_cohorts != 0) {
unsigned i;
for (i=0; i<glist_num(&cn->cohorts); i++) {
- if (MakeBuildChild(glist_get(&cn->cohorts, i), toBeMade_next)) {
+ if (MakeBuildChild(glist_get(&cn->cohorts, i), usemark)) {
break;
}
}
@@ -1158,12 +1165,12 @@ MakeBuildChild(GNode *cn, QPos *toBeMade
/* When a .ORDER LHS node completes we do this on each RHS */
static void
-MakeBuildParent(GNode *pn, QPos *toBeMade_next)
+MakeBuildParent(GNode *pn, Boolean usemark)
{
if (pn->made != DEFERRED)
return;
- if (MakeBuildChild(pn, toBeMade_next) == 0) {
+ if (MakeBuildChild(pn, usemark) == 0) {
/* Mark so that when this node is built we reschedule its parents */
pn->flags |= DONE_ORDER;
}
@@ -1211,9 +1218,12 @@ MakeStartJobs(void)
*/
gn->made = DEFERRED;
for (i=0; i<glist_num(&gn->children); i++) {
- if (MakeBuildChild(glist_get(&gn->children, i), MakeQ_First(&toBeMade))) {
+ MakeQ_SetMark(&toBeMade);
+ if (MakeBuildChild(glist_get(&gn->children, i), TRUE)) {
+ MakeQ_ClearMark(&toBeMade);
break;
}
+ MakeQ_ClearMark(&toBeMade);
}
/* and drop this node on the floor */
if (DEBUG(MAKE))
@@ -1563,7 +1573,7 @@ Make_ProcessWait(GList *targs)
}
/* Start building with the 'dummy' .MAIN' node */
- MakeBuildChild(pgn, NULL);
+ MakeBuildChild(pgn, FALSE);
glist_init(&examine);
glist_add(&examine, pgn, NULL);