diff --git a/src/util/inc/hash.h b/src/util/inc/hash.h index 6c4145810b9819e60a9cb979a8ab42795df3cf00..10b79bb9713cbcaf6d1d7158afda78c144b42ccc 100644 --- a/src/util/inc/hash.h +++ b/src/util/inc/hash.h @@ -36,7 +36,7 @@ typedef struct SHashNode { uint32_t dataLen; // length of data uint32_t keyLen; // length of the key int8_t removed; // flag to indicate removed - int8_t count; // reference count + int32_t count; // reference count char data[]; } SHashNode; diff --git a/src/util/src/hash.c b/src/util/src/hash.c index 28ba791c9cffec42ce5631933a6bf2ef187312db..b6696810c12371bb8269149d082ad6890ddc4dd4 100644 --- a/src/util/src/hash.c +++ b/src/util/src/hash.c @@ -119,7 +119,7 @@ static SHashNode *doCreateHashNode(const void *key, size_t keyLen, const void *p static FORCE_INLINE SHashNode *doUpdateHashNode(SHashObj *pHashObj, SHashEntry* pe, SHashNode* prev, SHashNode *pNode, SHashNode *pNewNode) { assert(pNode->keyLen == pNewNode->keyLen); - pNode->count--; + atomic_sub_fetch_32(&pNode->count, 1); if (prev != NULL) { prev->next = pNewNode; } else { @@ -459,7 +459,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe if (pNode) { code = 0; // it is found - pNode->count--; + atomic_sub_fetch_32(&pNode->count, 1); pNode->removed = 1; if (pNode->count <= 0) { if (prevNode) { @@ -809,7 +809,7 @@ static void *taosHashReleaseNode(SHashObj *pHashObj, void *p, int *slot) { pNode = pNode->next; } - pOld->count--; + atomic_sub_fetch_32(&pOld->count, 1); if (pOld->count <=0) { if (prevNode) { prevNode->next = pOld->next; @@ -875,7 +875,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { if (pNode) { SHashEntry *pe = pHashObj->hashList[slot]; - pNode->count++; + atomic_add_fetch_32(&pNode->count, 1); data = GET_HASH_NODE_DATA(pNode); if (pHashObj->type == HASH_ENTRY_LOCK) { taosWUnLockLatch(&pe->latch);