Pointer hash table reallocation code seems never to have been tested!

Unfortunately, reallocation also means that the pointer numbering will
change, so increase table size to try to avoid it.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7130 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vikram S. Adve
2003-07-08 18:42:44 +00:00
parent 47485df280
commit 0df8adc0e6

View File

@@ -26,7 +26,7 @@ typedef uint64_t Pointer;
/* Index IntegerHashFunc(const Generic value, const Index size) */ /* Index IntegerHashFunc(const Generic value, const Index size) */
#define IntegerHashFunc(value, size) \ #define IntegerHashFunc(value, size) \
(value % size) (((value << 3) ^ (value >> 3)) % size)
/* Index IntegerRehashFunc(const Generic oldHashValue, const Index size) */ /* Index IntegerRehashFunc(const Generic oldHashValue, const Index size) */
#define IntegerRehashFunc(oldHashValue, size) \ #define IntegerRehashFunc(oldHashValue, size) \
@@ -77,10 +77,9 @@ extern void Delete(PtrValueHashTable* ptrTable, void* ptr);
void void
InitializeTable(PtrValueHashTable* ptrTable, Index newSize) InitializeTable(PtrValueHashTable* ptrTable, Index newSize)
{ {
ptrTable->table = (PtrValueHashEntry*) malloc(newSize * ptrTable->table = (PtrValueHashEntry*) calloc(newSize,
sizeof(PtrValueHashEntry)); sizeof(PtrValueHashEntry));
ptrTable->fullEmptyFlags = (FULLEMPTY*) malloc(newSize * sizeof(FULLEMPTY)); ptrTable->fullEmptyFlags = (FULLEMPTY*) calloc(newSize, sizeof(FULLEMPTY));
memset(ptrTable->fullEmptyFlags, '\0', newSize * sizeof(FULLEMPTY));
ptrTable->capacity = newSize; ptrTable->capacity = newSize;
ptrTable->size = 0; ptrTable->size = 0;
} }
@@ -97,23 +96,41 @@ CreateTable(Index initialSize)
void void
ReallocTable(PtrValueHashTable* ptrTable, Index newSize) ReallocTable(PtrValueHashTable* ptrTable, Index newSize)
{ {
if (newSize > ptrTable->capacity) if (newSize <= ptrTable->capacity)
{ return;
unsigned int i;
#ifndef NDEBUG
printf("\n***\n*** WARNING: REALLOCATING SPACE FOR POINTER HASH TABLE.\n");
printf("*** oldSize = %ld, oldCapacity = %ld\n***\n\n",
ptrTable->size, ptrTable->capacity);
printf("*** NEW SEQUENCE NUMBER FOR A POINTER WILL PROBABLY NOT MATCH ");
printf(" THE OLD ONE!\n***\n\n");
#endif
unsigned int i;
PtrValueHashEntry* oldTable = ptrTable->table;
FULLEMPTY* oldFlags = ptrTable->fullEmptyFlags;
Index oldSize = ptrTable->size;
Index oldCapacity = ptrTable->capacity;
/* allocate the new storage and flags and re-insert the old entries */
InitializeTable(ptrTable, newSize);
memcpy(ptrTable->table, oldTable,
oldCapacity * sizeof(PtrValueHashEntry));
memcpy(ptrTable->fullEmptyFlags, oldFlags,
oldCapacity * sizeof(FULLEMPTY));
ptrTable->size = oldSize;
#ifndef NDEBUG
for (i=0; i < oldCapacity; ++i) {
assert(ptrTable->fullEmptyFlags[i] == oldFlags[i]);
assert(ptrTable->table[i].key == oldTable[i].key);
assert(ptrTable->table[i].value == oldTable[i].value);
}
#endif
PtrValueHashEntry* oldTable = ptrTable->table; free(oldTable);
FULLEMPTY* oldFlags = ptrTable->fullEmptyFlags; free(oldFlags);
Index oldSize = ptrTable->size;
/* allocate the new storage and flags and re-insert the old entries */
InitializeTable(ptrTable, newSize);
for (i=0; i < oldSize; ++i)
Insert(ptrTable, oldTable[i].key, oldTable[i].value);
assert(ptrTable->size == oldSize);
free(oldTable);
free(oldFlags);
}
} }
void void
@@ -231,7 +248,7 @@ Delete(PtrValueHashTable* ptrTable, void* ptr)
*===---------------------------------------------------------------------===*/ *===---------------------------------------------------------------------===*/
PtrValueHashTable* SequenceNumberTable = NULL; PtrValueHashTable* SequenceNumberTable = NULL;
Index INITIAL_SIZE = 1 << 18; Index INITIAL_SIZE = 1 << 22;
#define MAX_NUM_SAVED 1024 #define MAX_NUM_SAVED 1024