mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-24 12:55:45 +00:00
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. llvm-svn: 7130
This commit is contained in:
parent
bb4677de1e
commit
a23754ed38
@ -26,7 +26,7 @@ typedef uint64_t Pointer;
|
||||
|
||||
/* Index IntegerHashFunc(const Generic value, const Index size) */
|
||||
#define IntegerHashFunc(value, size) \
|
||||
(value % size)
|
||||
(((value << 3) ^ (value >> 3)) % size)
|
||||
|
||||
/* Index IntegerRehashFunc(const Generic oldHashValue, const Index size) */
|
||||
#define IntegerRehashFunc(oldHashValue, size) \
|
||||
@ -77,10 +77,9 @@ extern void Delete(PtrValueHashTable* ptrTable, void* ptr);
|
||||
void
|
||||
InitializeTable(PtrValueHashTable* ptrTable, Index newSize)
|
||||
{
|
||||
ptrTable->table = (PtrValueHashEntry*) malloc(newSize *
|
||||
ptrTable->table = (PtrValueHashEntry*) calloc(newSize,
|
||||
sizeof(PtrValueHashEntry));
|
||||
ptrTable->fullEmptyFlags = (FULLEMPTY*) malloc(newSize * sizeof(FULLEMPTY));
|
||||
memset(ptrTable->fullEmptyFlags, '\0', newSize * sizeof(FULLEMPTY));
|
||||
ptrTable->fullEmptyFlags = (FULLEMPTY*) calloc(newSize, sizeof(FULLEMPTY));
|
||||
ptrTable->capacity = newSize;
|
||||
ptrTable->size = 0;
|
||||
}
|
||||
@ -97,23 +96,41 @@ CreateTable(Index initialSize)
|
||||
void
|
||||
ReallocTable(PtrValueHashTable* ptrTable, Index newSize)
|
||||
{
|
||||
if (newSize > ptrTable->capacity)
|
||||
{
|
||||
unsigned int i;
|
||||
if (newSize <= ptrTable->capacity)
|
||||
return;
|
||||
|
||||
#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;
|
||||
FULLEMPTY* oldFlags = ptrTable->fullEmptyFlags;
|
||||
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);
|
||||
}
|
||||
free(oldTable);
|
||||
free(oldFlags);
|
||||
}
|
||||
|
||||
void
|
||||
@ -231,7 +248,7 @@ Delete(PtrValueHashTable* ptrTable, void* ptr)
|
||||
*===---------------------------------------------------------------------===*/
|
||||
|
||||
PtrValueHashTable* SequenceNumberTable = NULL;
|
||||
Index INITIAL_SIZE = 1 << 18;
|
||||
Index INITIAL_SIZE = 1 << 22;
|
||||
|
||||
#define MAX_NUM_SAVED 1024
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user