Module Name: src Committed By: sjg Date: Sat Jul 18 21:37:38 UTC 2020
Modified Files: src/usr.bin/make: hash.c hash.h main.c make.1 make.h Log Message: Add -dh for DEBUG_HASH Allow tracking of max chain length, to see how well the hash tables are working. Pull the actual hash operation into a marco so it can be easily changed - for experimenting. The current hash, is pretty good. Reviewed by: christos To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/usr.bin/make/hash.c cvs rdiff -u -r1.13 -r1.14 src/usr.bin/make/hash.h cvs rdiff -u -r1.279 -r1.280 src/usr.bin/make/main.c cvs rdiff -u -r1.282 -r1.283 src/usr.bin/make/make.1 cvs rdiff -u -r1.109 -r1.110 src/usr.bin/make/make.h 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.22 src/usr.bin/make/hash.c:1.23 --- src/usr.bin/make/hash.c:1.22 Fri Jul 3 17:03:09 2020 +++ src/usr.bin/make/hash.c Sat Jul 18 21:37:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: hash.c,v 1.22 2020/07/03 17:03:09 rillig Exp $ */ +/* $NetBSD: hash.c,v 1.23 2020/07/18 21:37:38 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.22 2020/07/03 17:03:09 rillig Exp $"; +static char rcsid[] = "$NetBSD: hash.c,v 1.23 2020/07/18 21:37:38 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.22 2020/07/03 17:03:09 rillig Exp $"); +__RCSID("$NetBSD: hash.c,v 1.23 2020/07/18 21:37:38 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -107,6 +107,14 @@ static void RebuildTable(Hash_Table *); #define rebuildLimit 3 +/* The hash function(s) */ +/* 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) + + /* *--------------------------------------------------------- * @@ -146,6 +154,7 @@ Hash_InitTable(Hash_Table *t, int numBuc continue; } t->numEntries = 0; + t->maxlen = 0; t->size = i; t->mask = i - 1; t->bucketPtr = hp = bmake_malloc(sizeof(*hp) * i); @@ -220,17 +229,25 @@ Hash_FindEntry(Hash_Table *t, const char Hash_Entry *e; unsigned h; const char *p; + int chainlen; if (t == NULL || t->bucketPtr == NULL) { return NULL; } - for (h = 0, p = key; *p;) - h = (h << 5) - h + *p++; + HASH(h, key, p); p = key; - for (e = t->bucketPtr[h & t->mask]; e != NULL; e = e->next) - if (e->namehash == h && strcmp(e->name, p) == 0) - return e; - return NULL; + if (DEBUG(HASH)) + fprintf(debug_file, "%s: %p h=%x key=%s\n", __func__, + t, h, key); + chainlen = 0; + 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; + return e; } /* @@ -265,23 +282,32 @@ Hash_CreateEntry(Hash_Table *t, const ch unsigned h; const char *p; int keylen; + int chainlen; struct Hash_Entry **hp; /* * Hash the key. As a side effect, save the length (strlen) of the * key in case we need to create the entry. */ - for (h = 0, p = key; *p;) - h = (h << 5) - h + *p++; + HASH(h, key, p); keylen = p - key; p = key; + if (DEBUG(HASH)) + fprintf(debug_file, "%s: %p h=%x key=%s\n", __func__, + t, h, key); + chainlen = 0; for (e = t->bucketPtr[h & t->mask]; e != NULL; e = e->next) { + chainlen++; if (e->namehash == h && strcmp(e->name, p) == 0) { if (newPtr != NULL) *newPtr = FALSE; - return e; + break; } } + if (chainlen > t->maxlen) + t->maxlen = chainlen; + if (e) + return e; /* * The desired entry isn't there. Before allocating a new entry, @@ -463,6 +489,10 @@ 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; } void Hash_ForEach(Hash_Table *t, void (*action)(void *, void *), void *data) Index: src/usr.bin/make/hash.h diff -u src/usr.bin/make/hash.h:1.13 src/usr.bin/make/hash.h:1.14 --- src/usr.bin/make/hash.h:1.13 Fri Jul 3 17:03:09 2020 +++ src/usr.bin/make/hash.h Sat Jul 18 21:37:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: hash.h,v 1.13 2020/07/03 17:03:09 rillig Exp $ */ +/* $NetBSD: hash.h,v 1.14 2020/07/18 21:37:38 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -100,6 +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 */ } Hash_Table; /* Index: src/usr.bin/make/main.c diff -u src/usr.bin/make/main.c:1.279 src/usr.bin/make/main.c:1.280 --- src/usr.bin/make/main.c:1.279 Fri Jul 3 08:13:23 2020 +++ src/usr.bin/make/main.c Sat Jul 18 21:37:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.279 2020/07/03 08:13:23 rillig Exp $ */ +/* $NetBSD: main.c,v 1.280 2020/07/18 21:37:38 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,7 +69,7 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: main.c,v 1.279 2020/07/03 08:13:23 rillig Exp $"; +static char rcsid[] = "$NetBSD: main.c,v 1.280 2020/07/18 21:37:38 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.279 2020/07/03 08:13:23 rillig Exp $"); +__RCSID("$NetBSD: main.c,v 1.280 2020/07/18 21:37:38 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -278,6 +278,9 @@ parse_debug_options(const char *argvalue ++modules; } break; + case 'h': + debug |= DEBUG_HASH; + break; case 'j': debug |= DEBUG_JOB; break; Index: src/usr.bin/make/make.1 diff -u src/usr.bin/make/make.1:1.282 src/usr.bin/make/make.1:1.283 --- src/usr.bin/make/make.1:1.282 Sat Jun 6 20:28:42 2020 +++ src/usr.bin/make/make.1 Sat Jul 18 21:37:38 2020 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.282 2020/06/06 20:28:42 wiz Exp $ +.\" $NetBSD: make.1,v 1.283 2020/07/18 21:37:38 sjg Exp $ .\" .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" from: @(#)make.1 8.4 (Berkeley) 3/19/94 .\" -.Dd June 5, 2020 +.Dd July 18, 2020 .Dt MAKE 1 .Os .Sh NAME @@ -166,6 +166,8 @@ Print the input graph after making every on error. .It Ar "g3" Print the input graph before exiting on error. +.It Ar h +Print debugging information about hash table operations. .It Ar j Print debugging information about running multiple shells. .It Ar l Index: src/usr.bin/make/make.h diff -u src/usr.bin/make/make.h:1.109 src/usr.bin/make/make.h:1.110 --- src/usr.bin/make/make.h:1.109 Thu Jul 2 15:14:38 2020 +++ src/usr.bin/make/make.h Sat Jul 18 21:37:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: make.h,v 1.109 2020/07/02 15:14:38 rillig Exp $ */ +/* $NetBSD: make.h,v 1.110 2020/07/18 21:37:38 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -465,6 +465,7 @@ extern int debug; #define DEBUG_ERROR 0x01000 #define DEBUG_LOUD 0x02000 #define DEBUG_META 0x04000 +#define DEBUG_HASH 0x08000 #define DEBUG_GRAPH3 0x10000 #define DEBUG_SCRIPT 0x20000