refactor: do some internal refactor.

This commit is contained in:
Haojun Liao 2023-01-16 18:40:44 +08:00
parent 138d1d26f0
commit abc8c0fda1
1 changed files with 20 additions and 35 deletions

View File

@ -88,22 +88,22 @@ int32_t tSimpleHashGetSize(const SSHashObj *pHashObj) {
if (!pHashObj) { if (!pHashObj) {
return 0; return 0;
} }
return (int32_t)atomic_load_64((int64_t *)&pHashObj->size); return (int32_t) pHashObj->size;
} }
static void* doInternalAlloc(SSHashObj* pHashObj, int32_t size) { static void* doInternalAlloc(SSHashObj* pHashObj, int32_t size) {
void** p = taosArrayGetLast(pHashObj->pHashNodeBuf); void** p = taosArrayGetLast(pHashObj->pHashNodeBuf);
if (p == NULL || (pHashObj->offset + size) > DEFAULT_BUF_PAGE_SIZE) { if (p == NULL || (pHashObj->offset + size) > DEFAULT_BUF_PAGE_SIZE) {
// let's allocate one new page // let's allocate one new page
if (size > DEFAULT_BUF_PAGE_SIZE) { int32_t allocSize = TMAX(size, DEFAULT_BUF_PAGE_SIZE);
// TODO void* pNewPage = taosMemoryMalloc(allocSize);
}
void* pNewPage = taosMemoryMalloc(DEFAULT_BUF_PAGE_SIZE);
if (pNewPage == NULL) { if (pNewPage == NULL) {
return NULL; return NULL;
} }
// if the allocate the buffer page is greater than the DFFAULT_BUF_PAGE_SIZE,
// pHashObj->offset will always be greater than DEFAULT_BUF_PAGE_SIZE, which means that
// current buffer page is full. And a new buffer page needs to be allocated.
pHashObj->offset = size; pHashObj->offset = size;
taosArrayPush(pHashObj->pHashNodeBuf, &pNewPage); taosArrayPush(pHashObj->pHashNodeBuf, &pNewPage);
return pNewPage; return pNewPage;
@ -144,7 +144,7 @@ static void tSimpleHashTableResize(SSHashObj *pHashObj) {
return; return;
} }
int64_t st = taosGetTimestampUs(); // int64_t st = taosGetTimestampUs();
void *pNewEntryList = taosMemoryRealloc(pHashObj->hashList, POINTER_BYTES * newCapacity); void *pNewEntryList = taosMemoryRealloc(pHashObj->hashList, POINTER_BYTES * newCapacity);
if (!pNewEntryList) { if (!pNewEntryList) {
uWarn("hash resize failed due to out of memory, capacity remain:%zu", pHashObj->capacity); uWarn("hash resize failed due to out of memory, capacity remain:%zu", pHashObj->capacity);
@ -189,8 +189,7 @@ static void tSimpleHashTableResize(SSHashObj *pHashObj) {
} }
} }
int64_t et = taosGetTimestampUs(); // int64_t et = taosGetTimestampUs();
// uDebug("hash table resize completed, new capacity:%d, load factor:%f, elapsed time:%fms", // uDebug("hash table resize completed, new capacity:%d, load factor:%f, elapsed time:%fms",
// (int32_t)pHashObj->capacity, // (int32_t)pHashObj->capacity,
// ((double)pHashObj->size) / pHashObj->capacity, (et - st) / 1000.0); // ((double)pHashObj->size) / pHashObj->capacity, (et - st) / 1000.0);
@ -218,7 +217,7 @@ int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, cons
} }
pHashObj->hashList[slot] = pNewNode; pHashObj->hashList[slot] = pNewNode;
atomic_add_fetch_64(&pHashObj->size, 1); pHashObj->size += 1;
return 0; return 0;
} }
@ -236,7 +235,7 @@ int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, cons
} }
pNewNode->next = pHashObj->hashList[slot]; pNewNode->next = pHashObj->hashList[slot];
pHashObj->hashList[slot] = pNewNode; pHashObj->hashList[slot] = pNewNode;
atomic_add_fetch_64(&pHashObj->size, 1); pHashObj->size += 1;
} else if (data) { // update data } else if (data) { // update data
memcpy(GET_SHASH_NODE_DATA(pNode), data, dataLen); memcpy(GET_SHASH_NODE_DATA(pNode), data, dataLen);
} }
@ -303,7 +302,7 @@ int32_t tSimpleHashRemove(SSHashObj *pHashObj, const void *key, size_t keyLen) {
pPrev->next = pNode->next; pPrev->next = pNode->next;
} }
FREE_HASH_NODE(pNode); FREE_HASH_NODE(pNode);
atomic_sub_fetch_64(&pHashObj->size, 1); pHashObj->size -= 1;
code = TSDB_CODE_SUCCESS; code = TSDB_CODE_SUCCESS;
break; break;
} }
@ -338,7 +337,7 @@ int32_t tSimpleHashIterateRemove(SSHashObj *pHashObj, const void *key, size_t ke
} }
FREE_HASH_NODE(pNode); FREE_HASH_NODE(pNode);
atomic_sub_fetch_64(&pHashObj->size, 1); pHashObj->size -= 1;
break; break;
} }
pPrev = pNode; pPrev = pNode;
@ -348,31 +347,19 @@ int32_t tSimpleHashIterateRemove(SSHashObj *pHashObj, const void *key, size_t ke
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
static void destroyItems(void* pItem) {
taosMemoryFree(*(void**)pItem);
}
void tSimpleHashClear(SSHashObj *pHashObj) { void tSimpleHashClear(SSHashObj *pHashObj) {
if (!pHashObj || taosHashTableEmpty(pHashObj)) { if (!pHashObj || taosHashTableEmpty(pHashObj)) {
return; return;
} }
// TODO recycle the allocated buffer. memset(pHashObj->hashList, 0, pHashObj->capacity * sizeof(void*));
SHNode *pNode = NULL, *pNext = NULL; taosArrayClearEx(pHashObj->pHashNodeBuf, destroyItems);
for (int32_t i = 0; i < pHashObj->capacity; ++i) { pHashObj->offset = 0;
pNode = pHashObj->hashList[i]; pHashObj->size = 0;
if (!pNode) {
continue;
}
while (pNode) {
pNext = pNode->next;
// FREE_HASH_NODE(pNode);
pNode = pNext;
}
pHashObj->hashList[i] = NULL;
}
atomic_store_64(&pHashObj->size, 0);
}
static void destroyItems(void* pItem) {
taosMemoryFree(*(void**)pItem);
} }
void tSimpleHashCleanup(SSHashObj *pHashObj) { void tSimpleHashCleanup(SSHashObj *pHashObj) {
@ -382,8 +369,6 @@ void tSimpleHashCleanup(SSHashObj *pHashObj) {
tSimpleHashClear(pHashObj); tSimpleHashClear(pHashObj);
taosMemoryFreeClear(pHashObj->hashList); taosMemoryFreeClear(pHashObj->hashList);
taosArrayDestroyEx(pHashObj->pHashNodeBuf, destroyItems);
taosMemoryFree(pHashObj); taosMemoryFree(pHashObj);
} }