This commit is contained in:
slguan 2019-09-05 14:36:49 +08:00
commit 90ff348542
1 changed files with 19 additions and 18 deletions

View File

@ -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);
}