enh: add memory pool
This commit is contained in:
parent
38a7dce5ca
commit
5f2ab7908a
|
@ -22,35 +22,41 @@ extern "C" {
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#define MP_CHUNKPOOL_MIN_BATCH_SIZE 1000
|
#define MP_CHUNKGRP_ALLOC_BATCH_SIZE 1000
|
||||||
|
#define MP_NSCHUNKGRP_ALLOC_BATCH_SIZE 500
|
||||||
#define MP_MAX_KEEP_FREE_CHUNK_NUM 1000
|
#define MP_MAX_KEEP_FREE_CHUNK_NUM 1000
|
||||||
|
|
||||||
#define MP_CHUNK_FLAG_IN_USE (1 << 0)
|
#define MP_CHUNK_FLAG_IN_USE (1 << 0)
|
||||||
#define MP_CHUNK_FLAG_NS_CHUNK (1 << 1)
|
#define MP_CHUNK_FLAG_NS_CHUNK (1 << 1)
|
||||||
|
|
||||||
|
#define MP_DBG_FLAG_LOG_MALLOC_FREE (1 << 0)
|
||||||
|
|
||||||
typedef struct SMPChunk {
|
typedef struct SMPChunk {
|
||||||
void *pNext;
|
void *pNext;
|
||||||
void *pMemStart;
|
char *pMemStart;
|
||||||
int32_t flags;
|
int32_t flags;
|
||||||
|
/* KEEP ABOVE SAME WITH SMPNSChunk */
|
||||||
|
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
} SMPChunk;
|
} SMPChunk;
|
||||||
|
|
||||||
typedef struct SMPNSChunk {
|
typedef struct SMPNSChunk {
|
||||||
void *pNext;
|
void *pNext;
|
||||||
void *pMemStart;
|
char *pMemStart;
|
||||||
int32_t flags;
|
int32_t flags;
|
||||||
uint32_t offset;
|
/* KEEP ABOVE SAME WITH SMPChunk */
|
||||||
|
|
||||||
uint32_t memBytes;
|
uint32_t offset;
|
||||||
|
uint64_t memBytes;
|
||||||
} SMPNSChunk;
|
} SMPNSChunk;
|
||||||
|
|
||||||
|
|
||||||
typedef struct SMPChunkCache {
|
typedef struct SMPChunkGroup {
|
||||||
int32_t chunkNum;
|
int32_t chunkNum;
|
||||||
int32_t idleOffset;
|
int32_t idleOffset;
|
||||||
SMPChunk *pChunks;
|
void *pChunks;
|
||||||
void* pNext;
|
void* pNext;
|
||||||
} SMPChunkCache;
|
} SMPChunkGroup;
|
||||||
|
|
||||||
typedef struct SMPMemoryStat {
|
typedef struct SMPMemoryStat {
|
||||||
int64_t chunkAlloc;
|
int64_t chunkAlloc;
|
||||||
|
@ -77,6 +83,7 @@ typedef struct SMPSession {
|
||||||
SMPChunk *srcChunkHead;
|
SMPChunk *srcChunkHead;
|
||||||
SMPChunk *srcChunkTail;
|
SMPChunk *srcChunkTail;
|
||||||
|
|
||||||
|
int32_t inUseChunkNum;
|
||||||
SMPChunk *inUseChunkHead;
|
SMPChunk *inUseChunkHead;
|
||||||
SMPChunk *inUseChunkTail;
|
SMPChunk *inUseChunkTail;
|
||||||
|
|
||||||
|
@ -92,22 +99,36 @@ typedef struct SMPSession {
|
||||||
SMPStat stat;
|
SMPStat stat;
|
||||||
} SMPSession;
|
} SMPSession;
|
||||||
|
|
||||||
|
typedef struct SMPChunkGroupInfo {
|
||||||
|
int16_t chunkNodeSize;
|
||||||
|
int64_t allocChunkNum;
|
||||||
|
int32_t chunkGroupNum;
|
||||||
|
SMPChunkGroup *pChunkGrpHead;
|
||||||
|
SMPChunkGroup *pChunkGrpTail;
|
||||||
|
void *pIdleChunkList;
|
||||||
|
} SMPChunkGroupInfo;
|
||||||
|
|
||||||
|
typedef struct SMPDebugInfo {
|
||||||
|
int64_t flags;
|
||||||
|
} SMPDebugInfo;
|
||||||
|
|
||||||
typedef struct SMemPool {
|
typedef struct SMemPool {
|
||||||
char *name;
|
char *name;
|
||||||
int16_t slotId;
|
int16_t slotId;
|
||||||
SMemPoolCfg cfg;
|
SMemPoolCfg cfg;
|
||||||
int32_t maxChunkNum;
|
int32_t maxChunkNum;
|
||||||
|
SMPDebugInfo dbgInfo;
|
||||||
|
|
||||||
|
int16_t maxDiscardSize;
|
||||||
double threadChunkReserveNum;
|
double threadChunkReserveNum;
|
||||||
int64_t allocChunkNum;
|
int64_t allocChunkNum;
|
||||||
|
int64_t allocChunkSize;
|
||||||
|
int64_t allocNSChunkNum;
|
||||||
|
int64_t allocNSChunkSize;
|
||||||
int64_t allocMemSize;
|
int64_t allocMemSize;
|
||||||
int64_t usedMemSize;
|
|
||||||
|
|
||||||
int64_t allocChunkCacheNum;
|
SMPChunkGroupInfo chunkGrpInfo;
|
||||||
int32_t chunkCacheUnitNum;
|
SMPChunkGroupInfo NSChunkGrpInfo;
|
||||||
SMPChunkCache *pChunkCacheHead;
|
|
||||||
SMPChunkCache *pChunkCacheTail;
|
|
||||||
SMPChunk *pIdleChunkList;
|
|
||||||
|
|
||||||
int32_t readyChunkNum;
|
int32_t readyChunkNum;
|
||||||
int32_t readyChunkReserveNum;
|
int32_t readyChunkReserveNum;
|
||||||
|
@ -124,15 +145,25 @@ typedef struct SMemPool {
|
||||||
SMPStat stat;
|
SMPStat stat;
|
||||||
} SMemPool;
|
} SMemPool;
|
||||||
|
|
||||||
#define MP_CHUNK_GET_FLAG(st, f) ((st) & (f))
|
#define MP_GET_FLAG(st, f) ((st) & (f))
|
||||||
#define MP_CHUNK_SET_FLAG(st, f) (st) |= (f)
|
#define MP_SET_FLAG(st, f) (st) |= (f)
|
||||||
#define MP_CHUNK_CLR_FLAG(st, f) (st) &= (~f)
|
#define MP_CLR_FLAG(st, f) (st) &= (~f)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MP_READ = 1,
|
MP_READ = 1,
|
||||||
MP_WRITE,
|
MP_WRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MP_ADD_TO_CHUNK_LIST(_chunkHead, _chunkTail, _chunkNum, _chunk) \
|
||||||
|
do { \
|
||||||
|
if (NULL == _chunkHead) { \
|
||||||
|
_chunkHead = _chunk; \
|
||||||
|
_chunkTail = _chunk; \
|
||||||
|
} else { \
|
||||||
|
(_chunkTail)->pNext = _chunk; \
|
||||||
|
} \
|
||||||
|
(_chunkNum)++; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define MP_LOCK(type, _lock) \
|
#define MP_LOCK(type, _lock) \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -104,7 +104,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CFG_VALUE, "Invalid configuration
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_IP_NOT_IN_WHITE_LIST, "Not allowed to connect")
|
TAOS_DEFINE_ERROR(TSDB_CODE_IP_NOT_IN_WHITE_LIST, "Not allowed to connect")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_FAILED_TO_CONNECT_S3, "Failed to connect to s3 server")
|
TAOS_DEFINE_ERROR(TSDB_CODE_FAILED_TO_CONNECT_S3, "Failed to connect to s3 server")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MSG_PREPROCESSED, "Message has been processed in preprocess")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MSG_PREPROCESSED, "Message has been processed in preprocess")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MEM_POOL_PARAM, "Invalid memory pool param")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MEM_POOL_PARAM, "Invalid memory pool input param")
|
||||||
|
|
||||||
//client
|
//client
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_INVALID_OPERATION, "Invalid operation")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_INVALID_OPERATION, "Invalid operation")
|
||||||
|
|
|
@ -45,56 +45,52 @@ int32_t memPoolCheckCfg(SMemPoolCfg* cfg) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void memPoolFreeChunkCache(SMPChunkCache* pCache) {
|
void memPoolFreeChunkGroup(SMPChunkGroup* pGrp) {
|
||||||
//TODO
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t memPoolAddChunkCache(SMemPool* pPool, SMPChunkCache* pTail) {
|
int32_t memPoolAddChunkGroup(SMemPool* pPool, SMPChunkGroupInfo* pInfo, SMPChunkGroup* pTail) {
|
||||||
if (0 == pPool->chunkCacheUnitNum) {
|
SMPChunkGroup* pGrp = NULL;
|
||||||
pPool->chunkCacheUnitNum = TMAX(pPool->maxChunkNum / 10, MP_CHUNKPOOL_MIN_BATCH_SIZE);
|
if (NULL == pInfo->pChunkGrpHead) {
|
||||||
}
|
pInfo->pChunkGrpHead = taosMemCalloc(1, sizeof(*pInfo->pChunkGrpHead));
|
||||||
|
if (NULL == pInfo->pChunkGrpHead) {
|
||||||
SMPChunkCache* pCache = NULL;
|
|
||||||
if (NULL == pPool->pChunkCacheHead) {
|
|
||||||
pPool->pChunkCacheHead = taosMemCalloc(1, sizeof(*pPool->pChunkCacheHead));
|
|
||||||
if (NULL == pPool->pChunkCacheHead) {
|
|
||||||
uError("malloc chunkCache failed");
|
uError("malloc chunkCache failed");
|
||||||
MP_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
MP_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pCache = pPool->pChunkCacheHead;
|
pGrp = pInfo->pChunkGrpHead;
|
||||||
} else {
|
} else {
|
||||||
pCache = (SMPChunkCache*)taosMemCalloc(1, sizeof(SMPChunkCache));
|
pGrp = (SMPChunkGroup*)taosMemCalloc(1, sizeof(SMPChunkGroup));
|
||||||
}
|
}
|
||||||
|
|
||||||
pCache->chunkNum = pPool->chunkCacheUnitNum;
|
pGrp->chunkNum = pInfo->chunkGroupNum;
|
||||||
pCache->pChunks = taosMemoryCalloc(pCache->chunkNum, sizeof(*pCache->pChunks));
|
pGrp->pChunks = taosMemoryCalloc(pGrp->chunkNum, pInfo->chunkNodeSize);
|
||||||
if (NULL == pCache->pChunks) {
|
if (NULL == pGrp->pChunks) {
|
||||||
uError("calloc %d chunks in cache failed", pCache->chunkNum);
|
uError("calloc %d %d chunks in chunk group failed", pGrp->chunkNum, pInfo->chunkNodeSize);
|
||||||
MP_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
MP_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atomic_val_compare_exchange_ptr(&pPool->pChunkCacheTail, pTail, pCache) != pTail) {
|
if (atomic_val_compare_exchange_ptr(&pInfo->pChunkGrpTail, pTail, pGrp) != pTail) {
|
||||||
memPoolFreeChunkCache(pCache);
|
memPoolFreeChunkGroup(pGrp);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_add_fetch_64(&pPool->allocChunkCacheNum, pCache->chunkNum);
|
atomic_add_fetch_64(&pInfo->allocChunkNum, pGrp->chunkNum);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t memPoolGetIdleChunk(SMemPool* pPool, SMPChunkCache** ppCache, SMPChunk** ppChunk) {
|
int32_t memPoolGetIdleChunk(SMemPool* pPool, SMPChunkGroupInfo* pInfo, void** ppChunk) {
|
||||||
SMPChunkCache* pCache = NULL;
|
SMPChunkGroup* pGrp = NULL;
|
||||||
SMPChunk* pChunk = NULL;
|
SMPChunk* pChunk = NULL;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
pChunk = (SMPChunk*)atomic_load_ptr(&pPool->pIdleChunkList);
|
pChunk = (SMPChunk*)atomic_load_ptr(&pInfo->pIdleChunkList);
|
||||||
if (NULL == pChunk) {
|
if (NULL == pChunk) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atomic_val_compare_exchange_ptr(&pPool->pIdleChunkList, pChunk, pChunk->pNext) != pChunk) {
|
if (atomic_val_compare_exchange_ptr(&pInfo->pIdleChunkList, pChunk, pChunk->pNext) != pChunk) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,32 +99,28 @@ int32_t memPoolGetIdleChunk(SMemPool* pPool, SMPChunkCache** ppCache, SMPChunk**
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
pCache = atomic_load_ptr(&pPool->pChunkCacheTail);
|
pGrp = atomic_load_ptr(&pInfo->pChunkGrpTail);
|
||||||
int32_t offset = atomic_fetch_add_32(&pCache->idleOffset, 1);
|
int32_t offset = atomic_fetch_add_32(&pGrp->idleOffset, 1);
|
||||||
if (offset < pCache->chunkNum) {
|
if (offset < pGrp->chunkNum) {
|
||||||
pChunk = pCache->pChunks + offset;
|
pChunk = (SMPChunk*)((char*)pGrp->pChunks + offset * pInfo->chunkNodeSize);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
atomic_sub_fetch_32(&pCache->idleOffset, 1);
|
atomic_sub_fetch_32(&pGrp->idleOffset, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
MP_ERR_RET(memPoolAddChunkCache(pPool, pCache));
|
MP_ERR_RET(memPoolAddChunkGroup(pPool, pInfo, pGrp));
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
if (NULL != ppCache) {
|
|
||||||
*ppCache = pCache;
|
|
||||||
}
|
|
||||||
|
|
||||||
*ppChunk = pChunk;
|
*ppChunk = pChunk;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t memPoolNewReadyChunk(SMemPool* pPool, SMPChunkCache** ppCache, SMPChunk** ppChunk) {
|
int32_t memPoolNewChunk(SMemPool* pPool, SMPChunk** ppChunk) {
|
||||||
SMPChunk* pChunk = NULL;
|
SMPChunk* pChunk = NULL;
|
||||||
MP_ERR_RET(memPoolGetIdleChunk(pPool, ppCache, &pChunk));
|
MP_ERR_RET(memPoolGetIdleChunk(pPool, &pPool->chunkGrpInfo, &pChunk));
|
||||||
|
|
||||||
pChunk->pMemStart = taosMemMalloc(pPool->cfg.chunkSize);
|
pChunk->pMemStart = taosMemMalloc(pPool->cfg.chunkSize);
|
||||||
if (NULL == pChunk->pMemStart) {
|
if (NULL == pChunk->pMemStart) {
|
||||||
|
@ -139,11 +131,29 @@ int32_t memPoolNewReadyChunk(SMemPool* pPool, SMPChunkCache** ppCache, SMPChunk*
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t memPoolAddReadyChunk(SMemPool* pPool, int32_t num) {
|
|
||||||
SMPChunkCache* pCache = NULL;
|
int32_t memPoolNewNSChunk(SMemPool* pPool, SMPNSChunk** ppChunk, int64_t chunkSize) {
|
||||||
|
SMPNSChunk* pChunk = NULL;
|
||||||
|
MP_ERR_RET(memPoolGetIdleChunk(pPool, &pPool->NSChunkGrpInfo, &pChunk));
|
||||||
|
|
||||||
|
pChunk->pMemStart = taosMemMalloc(chunkSize);
|
||||||
|
if (NULL == pChunk->pMemStart) {
|
||||||
|
uError("add new chunk, memory malloc %" PRId64 " failed", chunkSize);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pChunk->memBytes = chunkSize;
|
||||||
|
MP_SET_FLAG(pChunk->flags, MP_CHUNK_FLAG_NS_CHUNK);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t memPoolPrepareChunks(SMemPool* pPool, int32_t num) {
|
||||||
|
SMPChunkGroup* pGrp = NULL;
|
||||||
SMPChunk* pChunk = NULL;
|
SMPChunk* pChunk = NULL;
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
MP_ERR_RET(memPoolNewReadyChunk(pPool, &pCache, &pChunk));
|
MP_ERR_RET(memPoolNewChunk(pPool, &pGrp, &pChunk));
|
||||||
|
|
||||||
if (NULL == pPool->readyChunkTail) {
|
if (NULL == pPool->readyChunkTail) {
|
||||||
pPool->readyChunkHead = pChunk;
|
pPool->readyChunkHead = pChunk;
|
||||||
|
@ -158,7 +168,8 @@ int32_t memPoolAddReadyChunk(SMemPool* pPool, int32_t num) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t memPoolEnsureReadyChunks(SMemPool* pPool) {
|
|
||||||
|
int32_t memPoolEnsureChunks(SMemPool* pPool) {
|
||||||
if (E_EVICT_ALL == pPool->cfg.evicPolicy) {
|
if (E_EVICT_ALL == pPool->cfg.evicPolicy) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -168,7 +179,7 @@ int32_t memPoolEnsureReadyChunks(SMemPool* pPool) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
MP_ERR_RET(memPoolAddReadyChunk(pPool, readyMissNum));
|
MP_ERR_RET(memPoolPrepareChunks(pPool, readyMissNum));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -193,27 +204,32 @@ int32_t memPoolInit(SMemPool* pPool, char* poolName, SMemPoolCfg* cfg) {
|
||||||
pPool->threadChunkReserveNum = 1;
|
pPool->threadChunkReserveNum = 1;
|
||||||
pPool->readyChunkReserveNum = TMIN(cfg->threadNum * pPool->threadChunkReserveNum, pPool->maxChunkNum);
|
pPool->readyChunkReserveNum = TMIN(cfg->threadNum * pPool->threadChunkReserveNum, pPool->maxChunkNum);
|
||||||
|
|
||||||
MP_ERR_RET(memPoolAddChunkCache(pPool));
|
pPool->chunkGrpInfo.chunkGroupNum = TMAX(pPool->maxChunkNum / 10, MP_CHUNKGRP_ALLOC_BATCH_SIZE);
|
||||||
|
pPool->chunkGrpInfo.chunkNodeSize = sizeof(SMPChunk);
|
||||||
|
pPool->NSChunkGrpInfo.chunkGroupNum = MP_NSCHUNKGRP_ALLOC_BATCH_SIZE;
|
||||||
|
pPool->NSChunkGrpInfo.chunkNodeSize = sizeof(SMPNSChunk);
|
||||||
|
|
||||||
MP_ERR_RET(memPoolGetIdleChunk(pPool, NULL, &pPool->readyChunkHead));
|
MP_ERR_RET(memPoolAddChunkGroup(pPool, &pPool->chunkGrpInfo, NULL));
|
||||||
|
|
||||||
|
MP_ERR_RET(memPoolGetIdleChunk(pPool, &pPool->chunkGrpInfo, &pPool->readyChunkHead));
|
||||||
pPool->readyChunkTail = pPool->readyChunkHead;
|
pPool->readyChunkTail = pPool->readyChunkHead;
|
||||||
|
|
||||||
MP_ERR_RET(memPoolEnsureReadyChunks(pPool));
|
MP_ERR_RET(memPoolEnsureChunks(pPool));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void memPoolNotifyLowReadyChunk(SMemPool* pPool) {
|
void memPoolNotifyLowChunkNum(SMemPool* pPool) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t memPoolGetReadyChunk(SMemPool* pPool, SMPChunk** ppChunk) {
|
int32_t memPoolGetChunk(SMemPool* pPool, SMPChunk** ppChunk) {
|
||||||
SMPChunkCache* pCache = NULL;
|
SMPChunkGroup* pCache = NULL;
|
||||||
SMPChunk* pChunk = NULL;
|
SMPChunk* pChunk = NULL;
|
||||||
int32_t readyChunkNum = atomic_sub_fetch_32(&pPool->readyChunkNum, 1);
|
int32_t readyChunkNum = atomic_sub_fetch_32(&pPool->readyChunkNum, 1);
|
||||||
if (readyChunkNum >= 0) {
|
if (readyChunkNum >= 0) {
|
||||||
if (atomic_add_fetch_32(&pPool->readyChunkGotNum, 1) == pPool->readyChunkLowNum) {
|
if (atomic_add_fetch_32(&pPool->readyChunkGotNum, 1) == pPool->readyChunkLowNum) {
|
||||||
memPoolNotifyLowReadyChunk(pPool);
|
memPoolNotifyLowChunkNum(pPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
pChunk = (SMPChunk*)atomic_load_ptr(&pPool->readyChunkHead->pNext);
|
pChunk = (SMPChunk*)atomic_load_ptr(&pPool->readyChunkHead->pNext);
|
||||||
|
@ -226,9 +242,87 @@ int32_t memPoolGetReadyChunk(SMemPool* pPool, SMPChunk** ppChunk) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
MP_RET(memPoolNewReadyChunk(pPool, NULL, ppChunk));
|
MP_RET(memPoolNewChunk(pPool, NULL, ppChunk));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t memPoolGetChunkFromSession(SMemPool* pPool, SMPSession* pSession, int64_t size, SMPChunk** ppChunk, SMPChunk** ppPreChunk) {
|
||||||
|
SMPChunk* pChunk = pSession->srcChunkHead;
|
||||||
|
while (NULL != pChunk) {
|
||||||
|
if ((pChunk->offset + size) <= pPool->cfg.chunkSize) {
|
||||||
|
*ppChunk = pChunk;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppPreChunk = pChunk;
|
||||||
|
pChunk = (SMPChunk*)pChunk->pNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == *ppChunk) {
|
||||||
|
*ppPreChunk = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* memPoolAllocFromChunk(SMemPool* pPool, SMPSession* pSession, int64_t size) {
|
||||||
|
SMPChunk* pChunk = NULL, *preSrcChunk = NULL;
|
||||||
|
void* pRes = NULL;
|
||||||
|
if (pSession->srcChunkNum > 0) {
|
||||||
|
MP_ERR_JRET(memPoolGetChunkFromSession(pPool, pSession, size, &pChunk, &preSrcChunk));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == pChunk) {
|
||||||
|
MP_ERR_JRET(memPoolNewChunk(pPool, &pChunk));
|
||||||
|
|
||||||
|
pSession->allocChunkNum++;
|
||||||
|
pSession->allocChunkMemSize += pPool->cfg.chunkSize;
|
||||||
|
pSession->allocMemSize += size;
|
||||||
|
|
||||||
|
MP_ADD_TO_CHUNK_LIST(pSession->srcChunkHead, pSession->srcChunkTail, pSession->srcChunkNum, pChunk);
|
||||||
|
MP_ADD_TO_CHUNK_LIST(pSession->inUseChunkHead, pSession->inUseChunkTail, pSession->inUseChunkNum, pChunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
pRes = pChunk->pMemStart + pChunk->offset;
|
||||||
|
pChunk->offset += size;
|
||||||
|
|
||||||
|
if (pChunk->offset >= (pPool->cfg.chunkSize - pPool->maxDiscardSize)) {
|
||||||
|
if (NULL == preSrcChunk) {
|
||||||
|
pSession->srcChunkHead = NULL;
|
||||||
|
pSession->srcChunkTail = NULL;
|
||||||
|
} else {
|
||||||
|
preSrcChunk->pNext = pChunk->pNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSession->srcChunkNum--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
return pRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* memPoolAllocFromNSChunk(SMemPool* pPool, SMPSession* pSession, int64_t size) {
|
||||||
|
SMPNSChunk* pChunk = NULL;
|
||||||
|
MP_ERR_JRET(memPoolNewNSChunk(pPool, &pChunk, size));
|
||||||
|
|
||||||
|
pSession->allocChunkNum++;
|
||||||
|
pSession->allocChunkMemSize += size;
|
||||||
|
pSession->allocMemSize += size;
|
||||||
|
|
||||||
|
if (NULL == pSession->inUseNSChunkHead) {
|
||||||
|
pSession->inUseNSChunkHead = pChunk;
|
||||||
|
pSession->inUseNSChunkTail = pChunk;
|
||||||
|
} else {
|
||||||
|
pSession->inUseNSChunkTail->pNext = pChunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
return pChunk ? pChunk->pMemStart : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void taosMemPoolModInit(void) {
|
void taosMemPoolModInit(void) {
|
||||||
taosThreadMutexInit(&gMPoolMutex, NULL);
|
taosThreadMutexInit(&gMPoolMutex, NULL);
|
||||||
|
@ -236,7 +330,6 @@ void taosMemPoolModInit(void) {
|
||||||
gMPoolList = taosArrayInit(10, POINTER_BYTES);
|
gMPoolList = taosArrayInit(10, POINTER_BYTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t taosMemPoolOpen(char* poolName, SMemPoolCfg cfg, void** poolHandle) {
|
int32_t taosMemPoolOpen(char* poolName, SMemPoolCfg cfg, void** poolHandle) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SMemPool* pPool = NULL;
|
SMemPool* pPool = NULL;
|
||||||
|
@ -285,13 +378,14 @@ int32_t taosMemPoolInitSession(void* poolHandle, void** ppSession) {
|
||||||
MP_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
MP_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
MP_ERR_JRET(memPoolGetReadyChunk(pPool, &pSession->srcChunkHead));
|
MP_ERR_JRET(memPoolGetChunk(pPool, &pSession->srcChunkHead));
|
||||||
|
|
||||||
pSession->srcChunkTail = pSession->srcChunkHead;
|
|
||||||
pSession->srcChunkNum = 1;
|
|
||||||
pSession->allocChunkNum = 1;
|
pSession->allocChunkNum = 1;
|
||||||
pSession->allocChunkMemSize = pPool->cfg.chunkSize;
|
pSession->allocChunkMemSize = pPool->cfg.chunkSize;
|
||||||
|
|
||||||
|
MP_ADD_TO_CHUNK_LIST(pSession->srcChunkHead, pSession->srcChunkTail, pSession->srcChunkNum, pSession->srcChunkHead);
|
||||||
|
MP_ADD_TO_CHUNK_LIST(pSession->inUseChunkHead, pSession->inUseChunkTail, pSession->inUseChunkNum, pSession->srcChunkHead);
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
@ -304,33 +398,69 @@ _return:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *taosMemPoolMalloc(void* poolHandle, void* session, int64_t size, char* fileName, int32_t lineNo) {
|
void *taosMemPoolMalloc(void* poolHandle, void* session, int64_t size, char* fileName, int32_t lineNo) {
|
||||||
|
void *res = NULL;
|
||||||
|
|
||||||
|
if (NULL == poolHandle || NULL == session || NULL == fileName || size < 0) {
|
||||||
|
uError("%s invalid input param, handle:%p, session:%p, fileName:%p, size:%" PRId64, __FUNC__, poolHandle, session, fileName, size);
|
||||||
|
MP_ERR_JRET(TSDB_CODE_INVALID_MEM_POOL_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
SMemPool* pPool = (SMemPool*)poolHandle;
|
SMemPool* pPool = (SMemPool*)poolHandle;
|
||||||
SMPSession* pSession = (SMPSession*)session;
|
SMPSession* pSession = (SMPSession*)session;
|
||||||
|
res = (size > pPool->cfg.chunkSize) ? memPoolAllocFromNSChunk(pPool, pSession, size) : memPoolAllocFromChunk(pPool, pSession, size);
|
||||||
|
|
||||||
|
if (MP_GET_FLAG(pPool->dbgInfo.flags, MP_DBG_FLAG_LOG_MALLOC_FREE)) {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosMemPoolCalloc(void* poolHandle, void* session, int64_t num, int64_t size, char* fileName, int32_t lineNo) {
|
void *taosMemPoolCalloc(void* poolHandle, void* session, int64_t num, int64_t size, char* fileName, int32_t lineNo) {
|
||||||
|
void *res = NULL;
|
||||||
|
|
||||||
|
if (NULL == poolHandle || NULL == session || NULL == fileName || num < 0 || size < 0) {
|
||||||
|
uError("%s invalid input param, handle:%p, session:%p, fileName:%p, num:%" PRId64 ", size:%" PRId64,
|
||||||
|
__FUNC__, poolHandle, session, fileName, num, size);
|
||||||
|
MP_ERR_JRET(TSDB_CODE_INVALID_MEM_POOL_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
SMemPool* pPool = (SMemPool*)poolHandle;
|
||||||
|
SMPSession* pSession = (SMPSession*)session;
|
||||||
|
res = (size > pPool->cfg.chunkSize) ? memPoolAllocFromNSChunk(pPool, pSession, size) : memPoolAllocFromChunk(pPool, pSession, size);
|
||||||
|
|
||||||
|
memset(res, 0, num * size);
|
||||||
|
|
||||||
|
if (MP_GET_FLAG(pPool->dbgInfo.flags, MP_DBG_FLAG_LOG_MALLOC_FREE)) {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *taosMemPoolRealloc(void* poolHandle, void* session, void *ptr, int64_t size, char* fileName, int32_t lineNo) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosMemPoolRealloc(void* poolHandle, void* session, void *ptr, int64_t size) {
|
char *taosMemPoolStrdup(void* poolHandle, void* session, const char *ptr, char* fileName, int32_t lineNo) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *taosMemPoolStrdup(void* poolHandle, void* session, const char *ptr) {
|
void taosMemPoolFree(void* poolHandle, void* session, void *ptr, char* fileName, int32_t lineNo) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosMemPoolFree(void* poolHandle, void* session, void *ptr) {
|
int32_t taosMemPoolGetMemorySize(void* poolHandle, void* session, void *ptr, int64_t* size, char* fileName, int32_t lineNo) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosMemPoolGetMemorySize(void* poolHandle, void* session, void *ptr, int64_t* size) {
|
void *taosMemPoolMallocAlign(void* poolHandle, void* session, uint32_t alignment, int64_t size, char* fileName, int32_t lineNo) {
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void *taosMemPoolMallocAlign(void* poolHandle, void* session, uint32_t alignment, int64_t size) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue