Module Name: othersrc
Committed By: dholland
Date: Sat Mar 23 21:29:11 UTC 2013
Modified Files:
othersrc/usr.bin/dholland-make2: make.c
Log Message:
Improve the toBeMade logic: collect the non-tail insertions in a
separate array and stuff them into the main queue all at once.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 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.11 othersrc/usr.bin/dholland-make2/make.c:1.12
--- othersrc/usr.bin/dholland-make2/make.c:1.11 Sat Mar 23 21:28:04 2013
+++ othersrc/usr.bin/dholland-make2/make.c Sat Mar 23 21:29:11 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: make.c,v 1.11 2013/03/23 21:28:04 dholland Exp $ */
+/* $NetBSD: make.c,v 1.12 2013/03/23 21:29:11 dholland Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -111,12 +111,12 @@
#include "dir.h"
#include "job.h"
-MAKE_RCSID("$NetBSD: make.c,v 1.11 2013/03/23 21:28:04 dholland Exp $");
+MAKE_RCSID("$NetBSD: make.c,v 1.12 2013/03/23 21:29:11 dholland Exp $");
typedef struct {
- GList data;
- Boolean hasmark;
- unsigned markpos;
+ GList nodes;
+ GList insertions;
+ Boolean inserting;
} MakeQ;
static unsigned int checked = 1;/* Sequence # to detect recursion */
@@ -146,54 +146,60 @@ static void MakeBuildParent(GNode *, Boo
static void
MakeQ_Init(MakeQ *q)
{
- glist_init(&q->data);
- q->hasmark = FALSE;
- q->markpos = 0;
+ glist_init(&q->nodes);
+ glist_init(&q->insertions);
+ q->inserting = FALSE;
}
static Boolean
MakeQ_IsEmpty(MakeQ *q)
{
- return glist_num(&q->data) == 0;
+ return glist_num(&q->nodes) == 0 && glist_num(&q->insertions) == 0;
}
static void
MakeQ_AddTail(MakeQ *q, GNode *gn)
{
- if (q->hasmark && q->markpos >= glist_num(&q->data)) {
- q->markpos++;
- }
- glist_add(&q->data, gn, NULL);
+ glist_add(&q->nodes, gn, NULL);
}
static void
-MakeQ_AddBeforeMark(MakeQ *q, GNode *gn)
+MakeQ_Insert(MakeQ *q, GNode *gn)
{
- assert(q->hasmark);
- if (q->markpos >= glist_num(&q->data)) {
- glist_add(&q->data, gn, NULL);
- q->markpos++;
- } else {
- glist_insert(&q->data, q->markpos);
- glist_set(&q->data, q->markpos, gn);
- q->markpos++;
- }
+ assert(q->inserting);
+ glist_add(&q->insertions, gn, NULL);
}
static void
-MakeQ_SetMark(MakeQ *q)
+MakeQ_BeginInsertions(MakeQ *q)
{
- assert(!q->hasmark);
- q->hasmark = TRUE;
- q->markpos = 0;
+ assert(!q->inserting);
+ assert(glist_num(&q->insertions) == 0);
+ q->inserting = TRUE;
}
static void
-MakeQ_ClearMark(MakeQ *q)
+MakeQ_EndInsertions(MakeQ *q)
{
- assert(q->hasmark);
- q->hasmark = FALSE;
- q->markpos = 0;
+ unsigned i, num, ninsertions;
+
+ assert(q->inserting);
+ q->inserting = FALSE;
+
+ /* prepend insertions[] to nodes[] */
+
+ num = glist_num(&q->nodes);
+ ninsertions = glist_num(&q->insertions);
+
+ glist_setsize(&q->nodes, ninsertions + num);
+ /* must run this loop backwards */
+ for (i=num; i-- > 0; ) {
+ glist_set(&q->nodes, ninsertions + i, glist_get(&q->nodes, i));
+ }
+ for (i=0; i<ninsertions; i++) {
+ glist_set(&q->nodes, i, glist_get(&q->insertions, i));
+ }
+ glist_setsize(&q->insertions, 0);
}
static GNode *
@@ -201,11 +207,13 @@ MakeQ_PopHead(MakeQ *q)
{
GNode *ret;
- if (glist_num(&q->data) == 0) {
+ assert(q->inserting == FALSE);
+
+ if (glist_num(&q->nodes) == 0) {
return NULL;
}
- ret = glist_get(&q->data, 0);
- glist_remove(&q->data, 0);
+ ret = glist_get(&q->nodes, 0);
+ glist_remove(&q->nodes, 0);
return ret;
}
@@ -214,9 +222,11 @@ MakeQ_ForEach(MakeQ *q, int (*func)(void
{
unsigned i, num;
- num = glist_num(&q->data);
+ assert(q->inserting == FALSE);
+
+ num = glist_num(&q->nodes);
for (i=0; i<num; i++) {
- func(glist_get(&q->data, i), ptr);
+ func(glist_get(&q->nodes, i), ptr);
}
}
@@ -816,9 +826,9 @@ Make_Update(GNode *cgn)
for (i=0; i<glist_num(¢urion->order_succ); i++) {
succ = glist_get(¢urion->order_succ, i);
- MakeQ_SetMark(&toBeMade);
+ MakeQ_BeginInsertions(&toBeMade);
MakeBuildParent(succ, TRUE);
- MakeQ_ClearMark(&toBeMade);
+ MakeQ_EndInsertions(&toBeMade);
}
}
@@ -1135,7 +1145,7 @@ DoMakeCheckOrder(GList *order_pred)
}
static int
-MakeBuildChild(GNode *cn, Boolean usemark)
+MakeBuildChild(GNode *cn, Boolean doinsert)
{
if (DEBUG(MAKE))
fprintf(debug_file, "MakeBuildChild: inspect %s%s, made %d, type %x\n",
@@ -1155,16 +1165,16 @@ MakeBuildChild(GNode *cn, Boolean usemar
cn->name, cn->cohort_num);
cn->made = REQUESTED;
- if (usemark == FALSE)
- MakeQ_AddTail(&toBeMade, cn);
+ if (doinsert)
+ MakeQ_Insert(&toBeMade, cn);
else
- MakeQ_AddBeforeMark(&toBeMade, cn);
+ MakeQ_AddTail(&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), usemark)) {
+ if (MakeBuildChild(glist_get(&cn->cohorts, i), doinsert)) {
break;
}
}
@@ -1179,12 +1189,12 @@ MakeBuildChild(GNode *cn, Boolean usemar
/* When a .ORDER LHS node completes we do this on each RHS */
static void
-MakeBuildParent(GNode *pn, Boolean usemark)
+MakeBuildParent(GNode *pn, Boolean doinsert)
{
if (pn->made != DEFERRED)
return;
- if (MakeBuildChild(pn, usemark) == 0) {
+ if (MakeBuildChild(pn, doinsert) == 0) {
/* Mark so that when this node is built we reschedule its parents */
pn->flags |= DONE_ORDER;
}
@@ -1232,12 +1242,12 @@ MakeStartJobs(void)
*/
gn->made = DEFERRED;
for (i=0; i<glist_num(&gn->children); i++) {
- MakeQ_SetMark(&toBeMade);
+ MakeQ_BeginInsertions(&toBeMade);
if (MakeBuildChild(glist_get(&gn->children, i), TRUE)) {
- MakeQ_ClearMark(&toBeMade);
+ MakeQ_EndInsertions(&toBeMade);
break;
}
- MakeQ_ClearMark(&toBeMade);
+ MakeQ_EndInsertions(&toBeMade);
}
/* and drop this node on the floor */
if (DEBUG(MAKE))