diff --git a/src/util/src/tmempool.c b/src/util/src/tmempool.c index bba6ca9d50a461ff1523a393ac17e7cf6dbed22b..6276a3ed6c15ddb9e7f451c727aa0fde7d199d2a 100644 --- a/src/util/src/tmempool.c +++ b/src/util/src/tmempool.c @@ -64,6 +64,7 @@ mpool_h taosMemPoolInit(int numOfBlock, int blockSize) { pthread_mutex_init(&(pool_p->mutex), NULL); + memset(pool_p->pool, 0, (size_t)(blockSize * numOfBlock)); for (i = 0; i < pool_p->numOfBlock; ++i) pool_p->freeList[i] = i; pool_p->first = 0; @@ -78,9 +79,7 @@ char *taosMemPoolMalloc(mpool_h handle) { pthread_mutex_lock(&(pool_p->mutex)); - if (pool_p->numOfFree <= 0) { - pTrace("mempool: out of memory"); - } else { + if (pool_p->numOfFree > 0) { pos = pool_p->pool + pool_p->blockSize * (pool_p->freeList[pool_p->first]); pool_p->first++; pool_p->first = pool_p->first % pool_p->numOfBlock; @@ -88,7 +87,8 @@ char *taosMemPoolMalloc(mpool_h handle) { } pthread_mutex_unlock(&(pool_p->mutex)); - if (pos != NULL) memset(pos, 0, (size_t)pool_p->blockSize); + + if (pos == NULL) pTrace("mempool: out of memory"); return pos; } @@ -98,24 +98,25 @@ void taosMemPoolFree(mpool_h handle, char *pMem) { if (pMem == NULL) return; - pthread_mutex_lock(&pool_p->mutex); - index = (int)(pMem - pool_p->pool) % pool_p->blockSize; - if (index != 0) { pError("invalid free address:%p\n", pMem); - } else { - index = (int)((pMem - pool_p->pool) / pool_p->blockSize); - - if (index < 0 || index >= pool_p->numOfBlock) { - pError("mempool: error, invalid address:%p\n", pMem); - } else { - pool_p->freeList[(pool_p->first + pool_p->numOfFree) % pool_p->numOfBlock] = index; - pool_p->numOfFree++; - memset(pMem, 0, (size_t)pool_p->blockSize); - } + return; } + index = (int)((pMem - pool_p->pool) / pool_p->blockSize); + if (index < 0 || index >= pool_p->numOfBlock) { + pError("mempool: error, invalid address:%p\n", pMem); + return; + } + + memset(pMem, 0, (size_t)pool_p->blockSize); + + pthread_mutex_lock(&pool_p->mutex); + + pool_p->freeList[(pool_p->first + pool_p->numOfFree) % pool_p->numOfBlock] = index; + pool_p->numOfFree++; + pthread_mutex_unlock(&pool_p->mutex); } @@ -125,6 +126,6 @@ void taosMemPoolCleanUp(mpool_h handle) { pthread_mutex_destroy(&pool_p->mutex); if (pool_p->pool) free(pool_p->pool); if (pool_p->freeList) free(pool_p->freeList); - memset(&pool_p, 0, sizeof(pool_p)); + memset(pool_p, 0, sizeof(*pool_p)); free(pool_p); }