Module Name: src Committed By: sjg Date: Mon Jul 20 18:12:48 UTC 2020
Modified Files: src/usr.bin/make: hash.c hash.h main.c nonints.h targ.c var.c Log Message: Make DEBUG_HASH less of a fire-hose. Reporting keys on every lookup is overkill unless playing with a new HASH, so wrap in #ifdef DEBUG_HASH_LOOKUP Also add some stats at the end so we can see final size and max chain length - maxchain is a better variable name than maxlen. To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/usr.bin/make/hash.c cvs rdiff -u -r1.14 -r1.15 src/usr.bin/make/hash.h cvs rdiff -u -r1.282 -r1.283 src/usr.bin/make/main.c cvs rdiff -u -r1.80 -r1.81 src/usr.bin/make/nonints.h cvs rdiff -u -r1.63 -r1.64 src/usr.bin/make/targ.c cvs rdiff -u -r1.285 -r1.286 src/usr.bin/make/var.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/hash.c diff -u src/usr.bin/make/hash.c:1.24 src/usr.bin/make/hash.c:1.25 --- src/usr.bin/make/hash.c:1.24 Sun Jul 19 15:42:25 2020 +++ src/usr.bin/make/hash.c Mon Jul 20 18:12:48 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: hash.c,v 1.24 2020/07/19 15:42:25 riastradh Exp $ */ +/* $NetBSD: hash.c,v 1.25 2020/07/20 18:12:48 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -70,14 +70,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: hash.c,v 1.24 2020/07/19 15:42:25 riastradh Exp $"; +static char rcsid[] = "$NetBSD: hash.c,v 1.25 2020/07/20 18:12:48 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)hash.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: hash.c,v 1.24 2020/07/19 15:42:25 riastradh Exp $"); +__RCSID("$NetBSD: hash.c,v 1.25 2020/07/20 18:12:48 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -108,12 +108,15 @@ static void RebuildTable(Hash_Table *); #define rebuildLimit 3 /* The hash function(s) */ -/* This one matches Gosling's emacs */ + +#ifndef HASH +/* The default: this one matches Gosling's emacs */ #define HASH(h, key, p) do { \ for (h = 0, p = key; *p;) \ h = (h << 5) - h + *p++; \ } while (0) +#endif /* *--------------------------------------------------------- @@ -154,7 +157,7 @@ Hash_InitTable(Hash_Table *t, int numBuc continue; } t->numEntries = 0; - t->maxlen = 0; + t->maxchain = 0; t->size = i; t->mask = i - 1; t->bucketPtr = hp = bmake_malloc(sizeof(*hp) * i); @@ -236,17 +239,19 @@ Hash_FindEntry(Hash_Table *t, const char } HASH(h, key, p); p = key; + chainlen = 0; +#ifdef DEBUG_HASH_LOOKUP if (DEBUG(HASH)) fprintf(debug_file, "%s: %p h=%x key=%s\n", __func__, t, h, key); - chainlen = 0; +#endif for (e = t->bucketPtr[h & t->mask]; e != NULL; e = e->next) { chainlen++; if (e->namehash == h && strcmp(e->name, p) == 0) break; } - if (chainlen > t->maxlen) - t->maxlen = chainlen; + if (chainlen > t->maxchain) + t->maxchain = chainlen; return e; } @@ -292,10 +297,12 @@ Hash_CreateEntry(Hash_Table *t, const ch HASH(h, key, p); keylen = p - key; p = key; + chainlen = 0; +#ifdef DEBUG_HASH_LOOKUP if (DEBUG(HASH)) fprintf(debug_file, "%s: %p h=%x key=%s\n", __func__, t, h, key); - chainlen = 0; +#endif for (e = t->bucketPtr[h & t->mask]; e != NULL; e = e->next) { chainlen++; if (e->namehash == h && strcmp(e->name, p) == 0) { @@ -304,8 +311,8 @@ Hash_CreateEntry(Hash_Table *t, const ch break; } } - if (chainlen > t->maxlen) - t->maxlen = chainlen; + if (chainlen > t->maxchain) + t->maxchain = chainlen; if (e) return e; @@ -490,9 +497,9 @@ RebuildTable(Hash_Table *t) } free(oldhp); if (DEBUG(HASH)) - fprintf(debug_file, "%s: %p size=%d entries=%d maxlen=%d\n", - __func__, t, t->size, t->numEntries, t->maxlen); - t->maxlen = 0; + fprintf(debug_file, "%s: %p size=%d entries=%d maxchain=%d\n", + __func__, t, t->size, t->numEntries, t->maxchain); + t->maxchain = 0; } void Hash_ForEach(Hash_Table *t, void (*action)(void *, void *), void *data) @@ -505,3 +512,11 @@ void Hash_ForEach(Hash_Table *t, void (* e = Hash_EnumNext(&search)) action(Hash_GetValue(e), data); } + +void +Hash_DebugStats(Hash_Table *t, const char *name) +{ + if (DEBUG(HASH)) + fprintf(debug_file, "Hash_Table %s: size=%d numEntries=%d maxchain=%d\n", + name, t->size, t->numEntries, t->maxchain); +} Index: src/usr.bin/make/hash.h diff -u src/usr.bin/make/hash.h:1.14 src/usr.bin/make/hash.h:1.15 --- src/usr.bin/make/hash.h:1.14 Sat Jul 18 21:37:38 2020 +++ src/usr.bin/make/hash.h Mon Jul 20 18:12:48 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: hash.h,v 1.14 2020/07/18 21:37:38 sjg Exp $ */ +/* $NetBSD: hash.h,v 1.15 2020/07/20 18:12:48 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -100,7 +100,7 @@ typedef struct Hash_Table { int size; /* Actual size of array. */ int numEntries; /* Number of entries in the table. */ int mask; /* Used to select bits for hashing. */ - int maxlen; /* max length of chain detected */ + int maxchain; /* max length of chain detected */ } Hash_Table; /* @@ -147,5 +147,6 @@ void Hash_DeleteEntry(Hash_Table *, Hash Hash_Entry *Hash_EnumFirst(Hash_Table *, Hash_Search *); Hash_Entry *Hash_EnumNext(Hash_Search *); void Hash_ForEach(Hash_Table *, void (*)(void *, void *), void *); +void Hash_DebugStats(Hash_Table *, const char *); #endif /* _HASH_H */ Index: src/usr.bin/make/main.c diff -u src/usr.bin/make/main.c:1.282 src/usr.bin/make/main.c:1.283 --- src/usr.bin/make/main.c:1.282 Sun Jul 19 12:35:30 2020 +++ src/usr.bin/make/main.c Mon Jul 20 18:12:48 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.282 2020/07/19 12:35:30 rillig Exp $ */ +/* $NetBSD: main.c,v 1.283 2020/07/20 18:12:48 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,7 +69,7 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: main.c,v 1.282 2020/07/19 12:35:30 rillig Exp $"; +static char rcsid[] = "$NetBSD: main.c,v 1.283 2020/07/20 18:12:48 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint @@ -81,7 +81,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19 #if 0 static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: main.c,v 1.282 2020/07/19 12:35:30 rillig Exp $"); +__RCSID("$NetBSD: main.c,v 1.283 2020/07/20 18:12:48 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -2040,6 +2040,11 @@ PrintOnError(GNode *gn, const char *s) { static GNode *en = NULL; + if (DEBUG(HASH)) { + Targ_Stats(); + Var_Stats(); + } + /* we generally want to keep quiet if a sub-make died */ if (dieQuietly(gn, -1)) return; Index: src/usr.bin/make/nonints.h diff -u src/usr.bin/make/nonints.h:1.80 src/usr.bin/make/nonints.h:1.81 --- src/usr.bin/make/nonints.h:1.80 Sun Jul 19 12:26:17 2020 +++ src/usr.bin/make/nonints.h Mon Jul 20 18:12:48 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: nonints.h,v 1.80 2020/07/19 12:26:17 rillig Exp $ */ +/* $NetBSD: nonints.h,v 1.81 2020/07/20 18:12:48 sjg Exp $ */ /*- * Copyright (c) 1988, 1989, 1990, 1993 @@ -159,6 +159,7 @@ void Suff_PrintAll(void); /* targ.c */ void Targ_Init(void); void Targ_End(void); +void Targ_Stats(void); Lst Targ_List(void); GNode *Targ_NewGN(const char *); GNode *Targ_FindNode(const char *, int); @@ -194,6 +195,7 @@ char *Var_GetTail(const char *); char *Var_GetHead(const char *); void Var_Init(void); void Var_End(void); +void Var_Stats(void); void Var_Dump(GNode *); void Var_ExportVars(void); void Var_Export(char *, int); Index: src/usr.bin/make/targ.c diff -u src/usr.bin/make/targ.c:1.63 src/usr.bin/make/targ.c:1.64 --- src/usr.bin/make/targ.c:1.63 Fri Jul 3 08:02:55 2020 +++ src/usr.bin/make/targ.c Mon Jul 20 18:12:48 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: targ.c,v 1.63 2020/07/03 08:02:55 rillig Exp $ */ +/* $NetBSD: targ.c,v 1.64 2020/07/20 18:12:48 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: targ.c,v 1.63 2020/07/03 08:02:55 rillig Exp $"; +static char rcsid[] = "$NetBSD: targ.c,v 1.64 2020/07/20 18:12:48 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)targ.c 8.2 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: targ.c,v 1.63 2020/07/03 08:02:55 rillig Exp $"); +__RCSID("$NetBSD: targ.c,v 1.64 2020/07/20 18:12:48 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -186,6 +186,7 @@ Targ_Init(void) void Targ_End(void) { + Targ_Stats(); #ifdef CLEANUP Lst_Destroy(allTargets, NULL); if (allGNs) @@ -194,6 +195,12 @@ Targ_End(void) #endif } +void +Targ_Stats(void) +{ + Hash_DebugStats(&targets, "targets"); +} + /*- *----------------------------------------------------------------------- * Targ_List -- Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.285 src/usr.bin/make/var.c:1.286 --- src/usr.bin/make/var.c:1.285 Mon Jul 20 16:55:10 2020 +++ src/usr.bin/make/var.c Mon Jul 20 18:12:48 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.285 2020/07/20 16:55:10 rillig Exp $ */ +/* $NetBSD: var.c,v 1.286 2020/07/20 18:12:48 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.285 2020/07/20 16:55:10 rillig Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.286 2020/07/20 18:12:48 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: var.c,v 1.285 2020/07/20 16:55:10 rillig Exp $"); +__RCSID("$NetBSD: var.c,v 1.286 2020/07/20 18:12:48 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -3992,6 +3992,13 @@ Var_Init(void) void Var_End(void) { + Var_Stats(); +} + +void +Var_Stats(void) +{ + Hash_DebugStats(&VAR_GLOBAL->context, "VAR_GLOBAL"); }