diff --git a/src/stralloc.c b/src/stralloc.c index 034d0448f8226bbccebbe98072a20180c669dfca..0866f05bbf364094ffb0f5fd9b40c5dd460eb794 100644 --- a/src/stralloc.c +++ b/src/stralloc.c @@ -73,11 +73,8 @@ static PIKE_MUTEX_T *bucket_locks; #define BEGIN_HASH_SIZE 1024 -/* Experimental dynamic hash length */ -#ifndef HASH_PREFIX -static unsigned int HASH_PREFIX=64; +static unsigned int hash_prefix_len=64; static unsigned int need_more_hash_prefix_depth=0; -#endif /* Force a new hashkey to be generated early during init. */ static unsigned int need_new_hashkey_depth=0xffff; @@ -92,7 +89,7 @@ PMOD_EXPORT struct pike_string *empty_pike_string = 0; /*** Main string hash function ***/ #define StrHash(s,len) low_do_hash(s,len,0) -#define low_do_hash(STR,LEN,SHIFT) low_hashmem( (STR), (LEN)<<(SHIFT), HASH_PREFIX<<(SHIFT), hashkey ) +#define low_do_hash(STR,LEN,SHIFT) low_hashmem( (STR), (LEN)<<(SHIFT), hash_prefix_len<<(SHIFT), hashkey ) #define do_hash(STR) low_do_hash(STR->str,STR->len,STR->size_shift) /* Returns true if str could contain n. */ @@ -478,9 +475,8 @@ static struct pike_string *internal_findstring(const char *s, struct pike_string *curr; //,**prev, **base; unsigned int depth=0; -#ifndef HASH_PREFIX unsigned int prefix_depth=0; -#endif + size_t h; LOCK_BUCKET(hval); h=HMODULO(hval); @@ -509,29 +505,25 @@ static struct pike_string *internal_findstring(const char *s, return curr; /* pointer to string */ } depth++; -#ifndef HASH_PREFIX - if (curr->len > (ptrdiff_t)HASH_PREFIX) + if (curr->len > (ptrdiff_t)hash_prefix_len) prefix_depth++; -#endif } if (depth > need_new_hashkey_depth) { /* Keep track of whether the hashtable is getting unbalanced. */ need_new_hashkey_depth = depth; } -#ifndef HASH_PREFIX /* These heuruistics might require tuning! /Hubbe */ if (prefix_depth > need_more_hash_prefix_depth) { #if 0 fprintf(stderr, "prefix_depth=%d num_strings=%d need_more_hash_prefix_depth=%d\n" - " HASH_PREFIX=%d\n", + " hash_prefix_len=%d\n", prefix_depth, num_strings, need_more_hash_prefix_depth, - HASH_PREFIX); + hash_prefix_len); #endif /* 0 */ need_more_hash_prefix_depth = prefix_depth; } -#endif /* !HASH_PREFIX */ UNLOCK_BUCKET(hval); return 0; /* not found */ } @@ -732,16 +724,15 @@ static void link_pike_string(struct pike_string *s, size_t hval) stralloc_rehash(); } -#ifndef HASH_PREFIX /* These heuristics might require tuning! /Hubbe */ if((need_more_hash_prefix_depth > 4) || (need_new_hashkey_depth > 128)) { /* Changed heuristic 2005-01-17: * - * Increase HASH_PREFIX if there's some bucket containing + * Increase hash_prefix_len if there's some bucket containing * more than 4 strings that are longer - * than HASH_PREFIX. + * than hash_prefix_len. * /grubba * * Changed heuristic 2011-12-30: @@ -769,13 +760,14 @@ static void link_pike_string(struct pike_string *s, size_t hval) #endif /* A simple mixing function. */ - hashkey ^= (hashkey << 5) | (current_time.tv_sec ^ current_time.tv_usec); + hashkey ^= (hashkey << 5) ^ (current_time.tv_sec ^ current_time.tv_usec); - if (need_more_hash_prefix_depth > 4) { - HASH_PREFIX=HASH_PREFIX*2; + if (need_more_hash_prefix_depth > 4) + { + hash_prefix_len=hash_prefix_len*2; #if 0 - fprintf(stderr, "Doubling HASH_PREFIX to %d and rehashing\n", - HASH_PREFIX); + fprintf(stderr, "Doubling hash_prefix_len to %d and rehashing\n", + hash_prefix_len); #endif /* 0 */ } /* NOTE: No need to update to the correct values, since that will @@ -805,7 +797,6 @@ static void link_pike_string(struct pike_string *s, size_t hval) for(h=0;h<BUCKET_LOCKS;h++) mt_unlock(bucket_locks + h); #endif } -#endif /* !HASH_PREFIX */ } PMOD_EXPORT struct pike_string *debug_begin_wide_shared_string(size_t len, int shift) @@ -843,7 +834,7 @@ PMOD_EXPORT struct pike_string *debug_begin_wide_shared_string(size_t len, int s PMOD_EXPORT void hash_string(struct pike_string *s) { if (!(s->flags & STRING_NOT_HASHED)) return; - /* if( s->len < HASH_PREFIX ) */ + /* if( s->len < hash_prefix_len ) */ /* check_string_range( s, 0, 0, 0 ); */ s->hval=do_hash(s); s->flags &= ~STRING_NOT_HASHED; @@ -1955,15 +1946,15 @@ struct pike_string *modify_shared_string(struct pike_string *a, unlink_pike_string(a); low_set_index(a, index, c); CLEAR_STRING_CHECKED(a); - if((((unsigned int)index) >= HASH_PREFIX) && (index < a->len-8)) + if((((unsigned int)index) >= hash_prefix_len) && (index < a->len-8)) { struct pike_string *old; + /* Doesn't change hash value - sneak it in there */ #ifdef PIKE_DEBUG if (wrong_hash(a)) { Pike_fatal("Broken hash optimization.\n"); } #endif - /* Doesn't change hash value - sneak it in there */ old = internal_findstring(a->str, a->len, a->size_shift, a->hval); if (old) { /* The new string is equal to some old string. */