Branch: Tag:

2012-02-09

2012-02-09 13:29:48 by Arne Goedeke <el@laramies.com>

traverse both buckets at once

319: Inside #if defined(COUNT)
  #ifdef COUNT    count_name = "hash";   #endif - #ifdef BA_DEBUG -  int c = 0; - #endif -  ba_page_t n; +     ba_page p; -  n = a->htable[hash1(a, ptr) & BA_HASH_MASK(a)]; -  while (n) { -  p = BA_PAGE(a, n); +  ba_page_t n1, n2; +  n1 = a->htable[hash1(a, ptr) & BA_HASH_MASK(a)]; +  n2 = a->htable[hash2(a, ptr) & BA_HASH_MASK(a)]; +  +  while (n1 || n2) { +  if (n1) { +  p = BA_PAGE(a, n1);    if (BA_CHECK_PTR(a, p, ptr)) { -  INC(good); -  return n; +  return n1;    } -  n = p->hchain; +  n1 = p->hchain;    } -  n = a->htable[hash2(a, ptr) & BA_HASH_MASK(a)]; -  while (n) { -  p = BA_PAGE(a, n); +  if (n2) { +  p = BA_PAGE(a, n2);    if (BA_CHECK_PTR(a, p, ptr)) { -  if (a->htable[hash1(a, ptr) & BA_HASH_MASK(a)]) -  INC(ugly); -  else INC(bad); -  return n; +  return n2;    } - #ifdef BA_DEBUG -  if (c++ > a->allocated) { -  Pike_error("hash chain is infinite\n"); +  n2 = p->hchain;    } - #endif -  n = p->hchain; +     }       return 0;