Hello

I've found that when I use the hash table in hash.c with small hash sizes
I get a lock-up.  More specifically

hash_init with size < 8 gives a ht_size of 8 and more importantly a
ht_capacity of 8 (equal to ht_size).  The problem arise when inserting
items using hash_insert and the hash-table already being full.
hash_insert first calls hash_find_slot to find a suitable location for the
new item, but it can't since the hash is full (=> infinite loop).
Rehashing is done only after inserting the item (and should have been done
after inserting the item that completely filled the table), but wasn't
since the 

  if (ht->ht_empty_slots < ht->ht_size - ht->ht_capacity)

in hash_insert_at can't be true if capacity == size.  I suggest to change
< into <= , which should make it work for all initial hash-sizes, also
when capacity == size.

I looked around in the make source, and all hash_init seem to be either
already creating hash tables >= 16 (which work), or already know the final
size so rehashing isn't required.

By the way, ht_capacity is initialised to the same in hash_init and
hash_rehash, but with slightly different statements:

  ht->ht_capacity = ht->ht_size - (ht->ht_size / 16); /* 93.75% loading
factor */
  ht->ht_capacity = ht->ht_size - (ht->ht_size >> 4);



Best Regards,
  Håkan Johansson



_______________________________________________
Bug-make mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-make

Reply via email to