First version of #25 implementation, providing memory_get_usage/memory_get_peak_usage/memory_limit
Some checks reported errors
The build has failed.

This commit is contained in:
2018-08-09 07:37:56 +00:00
parent 8f7fc71027
commit 6e225ad836
10 changed files with 142 additions and 25 deletions

View File

@@ -86,18 +86,35 @@ PH7_PRIVATE sxu32 SyMemcpy(const void *pSrc, void *pDest, sxu32 nLen) {
SX_MACRO_FAST_MEMCPY(pSrc, pDest, nLen);
return nLen;
}
static void *MemOSAlloc(sxu32 nBytes) {
#define CheckHeap(HEAP, BYTES)\
if(HEAP->iMax && HEAP->nBytes + BYTES > HEAP->iMax) {\
fprintf(stderr, "Out of memory, max allowed %llu bytes, allocated %llu bytes\n", HEAP->iMax, HEAP->nBytes);\
PH7_VmRelease(HEAP->pVm);\
exit(255);\
}\
(void)BYTES
#define AddToHeap(HEAP, BYTES)\
HEAP->nBytes += BYTES;\
if(HEAP->nBytes > HEAP->iPeak) {\
HEAP->iPeak = HEAP->nBytes;\
}\
(void)BYTES
static void *MemOSAlloc(sxu32 nBytes, ph7_heap *pHeap) {
sxu32 *pChunk;
CheckHeap(pHeap, nBytes);
pChunk = (sxu32 *)SyOSHeapAlloc(nBytes + sizeof(sxu32));
if(pChunk == 0) {
return 0;
}
pChunk[0] = nBytes;
AddToHeap(pHeap, nBytes);
return (void *)&pChunk[1];
}
static void *MemOSRealloc(void *pOld, sxu32 nBytes) {
static void *MemOSRealloc(void *pOld, sxu32 nBytes, ph7_heap *pHeap) {
sxu32 *pOldChunk;
sxu32 *pChunk;
CheckHeap(pHeap, nBytes);
pOldChunk = (sxu32 *)(((char *)pOld) - sizeof(sxu32));
if(pOldChunk[0] >= nBytes) {
return pOld;
@@ -107,11 +124,13 @@ static void *MemOSRealloc(void *pOld, sxu32 nBytes) {
return 0;
}
pChunk[0] = nBytes;
AddToHeap(pHeap, abs(nBytes - pOldChunk[0]));
return (void *)&pChunk[1];
}
static void MemOSFree(void *pBlock) {
void *pChunk;
pChunk = (void *)(((char *)pBlock) - sizeof(sxu32));
static void MemOSFree(void *pBlock, ph7_heap *pHeap) {
sxu32 *pChunk;
pChunk = (sxu32 *)(((char *)pBlock) - sizeof(sxu32));
pHeap->nBytes -= pChunk[0];
SyOSHeapFree(pChunk);
}
static sxu32 MemOSChunkSize(void *pBlock) {
@@ -137,14 +156,14 @@ static void *MemBackendAlloc(SyMemBackend *pBackend, sxu32 nByte) {
*/
nByte += sizeof(SyMemBlock);
for(;;) {
pBlock = (SyMemBlock *)pBackend->pMethods->xAlloc(nByte);
pBlock = (SyMemBlock *)pBackend->pMethods->xAlloc(nByte, &pBackend->pHeap);
if(pBlock != 0 || pBackend->xMemError == 0 || nRetry > SXMEM_BACKEND_RETRY
|| SXERR_RETRY != pBackend->xMemError(pBackend->pUserData)) {
break;
}
nRetry++;
}
if(pBlock == 0) {
if(pBlock == 0) {
return 0;
}
pBlock->pNext = pBlock->pPrev = 0;
@@ -188,7 +207,7 @@ static void *MemBackendRealloc(SyMemBackend *pBackend, void *pOld, sxu32 nByte)
pPrev = pBlock->pPrev;
pNext = pBlock->pNext;
for(;;) {
pNew = (SyMemBlock *)pBackend->pMethods->xRealloc(pBlock, nByte);
pNew = (SyMemBlock *)pBackend->pMethods->xRealloc(pBlock, nByte, &pBackend->pHeap);
if(pNew != 0 || pBackend->xMemError == 0 || nRetry > SXMEM_BACKEND_RETRY ||
SXERR_RETRY != pBackend->xMemError(pBackend->pUserData)) {
break;
@@ -246,7 +265,7 @@ static sxi32 MemBackendFree(SyMemBackend *pBackend, void *pChunk) {
#endif
MACRO_LD_REMOVE(pBackend->pBlocks, pBlock);
pBackend->nBlock--;
pBackend->pMethods->xFree(pBlock);
pBackend->pMethods->xFree(pBlock, &pBackend->pHeap);
}
return SXRET_OK;
}
@@ -538,6 +557,7 @@ PH7_PRIVATE sxi32 SyMemBackendInitFromParent(SyMemBackend *pBackend, SyMemBacken
pBackend->pMethods = pParent->pMethods;
pBackend->xMemError = pParent->xMemError;
pBackend->pUserData = pParent->pUserData;
pBackend->pHeap.iMax = pParent->pHeap.iMax;
bInheritMutex = pParent->pMutexMethods ? TRUE : FALSE;
if(bInheritMutex) {
pBackend->pMutexMethods = pParent->pMutexMethods;
@@ -560,7 +580,7 @@ static sxi32 MemBackendRelease(SyMemBackend *pBackend) {
break;
}
pNext = pBlock->pNext;
pBackend->pMethods->xFree(pBlock);
pBackend->pMethods->xFree(pBlock, &pBackend->pHeap);
pBlock = pNext;
pBackend->nBlock--;
/* LOOP ONE */
@@ -568,7 +588,7 @@ static sxi32 MemBackendRelease(SyMemBackend *pBackend) {
break;
}
pNext = pBlock->pNext;
pBackend->pMethods->xFree(pBlock);
pBackend->pMethods->xFree(pBlock, &pBackend->pHeap);
pBlock = pNext;
pBackend->nBlock--;
/* LOOP TWO */
@@ -576,7 +596,7 @@ static sxi32 MemBackendRelease(SyMemBackend *pBackend) {
break;
}
pNext = pBlock->pNext;
pBackend->pMethods->xFree(pBlock);
pBackend->pMethods->xFree(pBlock, &pBackend->pHeap);
pBlock = pNext;
pBackend->nBlock--;
/* LOOP THREE */
@@ -584,7 +604,7 @@ static sxi32 MemBackendRelease(SyMemBackend *pBackend) {
break;
}
pNext = pBlock->pNext;
pBackend->pMethods->xFree(pBlock);
pBackend->pMethods->xFree(pBlock, &pBackend->pHeap);
pBlock = pNext;
pBackend->nBlock--;
/* LOOP FOUR */
@@ -853,4 +873,4 @@ PH7_PRIVATE sxi32 SyBlobSearch(const void *pBlob, sxu32 nLen, const void *pPatte
zIn++;
}
return SXERR_NOTFOUND;
}
}