📄 rvpoolmem.c
字号:
int i, arraysize;
void **blockarray;
RvPrintf("++++Testing memory pool++++\n");
RvPrintf("Type=");
switch(attr->pooltype) {
case RV_OBJPOOL_TYPE_FIXED: RvPrintf("FIXED");
break;
case RV_OBJPOOL_TYPE_EXPANDING: RvPrintf("EXPANDING");
break;
case RV_OBJPOOL_TYPE_DYNAMIC: RvPrintf("DYNAMIC");
break;
}
RvPrintf(", block size=%u, max=%u, min=%u, freelevel=%u\n", blocksize, attr->maxblocks, attr->minblocks, attr->freelevel);
RvPrintf("blocks/page=%u, pagesize=%u, starting blocks=%u, starting pages=%u\n", attr->pageblocks, attr->pagesize, attr->startblocks, attr->startpages);
objpool = ®ion.driverData.poolMemData.objpool; /* cheat to check internals */
RvPrintf("RvMemoryConstruct: ");
/* Pages from default allocator and no out-of-memory callback */
result = RvMemoryConstruct(®ion, RV_MEMORY_DRIVER_POOLMEM, name, NULL, blocksize, NULL, RvPoolMemTestNoMemory, attr);
if(result != RV_OK) {
RvPoolMemPrintError(result);
RvPrintf("++++Pool Test Aborted++++\n");
return;
} else RvPrintf("OK\n");
RvPrintf("RvObjPoolItemsPerPage = %u\n", RvObjPoolItemsPerPage(objpool));
RvPrintf("RvObjPoolItemsBlockSize = %u\n", RvObjPoolItemBlockSize(objpool));
RvPrintf("RvObjPoolPageSize = %u\n", RvObjPoolPageSize(objpool));
RvPoolMemTestGetInfo(®ion);
RvPrintf("RvMemoryAlloc: ");
result = RvMemoryAlloc(®ion, &ptr, 1); /* size shouldn't matter */
if(result != RV_OK) {
RvPoolMemPrintError(result);
ptr = NULL;
} else RvPrintf("OK. ptr = %p\n", ptr);
RvPrintf("RvObjPoolTotalItems = %u\n", RvObjPoolTotalItems(objpool));
RvPrintf("RvObjPoolFreeItems = %u\n", RvObjPoolFreeItems(objpool));
RvPrintf("RvObjPoolTotalPages = %u\n", RvObjPoolTotalPages(objpool));
RvPoolMemTestGetInfo(®ion);
if(ptr != NULL) {
RvPrintf("RvMemoryFree: ");
result = RvMemoryFree(ptr);
if(result != RV_OK) {
RvPoolMemPrintError(result);
} else RvPrintf("OK.\n");
RvPrintf("RvObjPoolTotalItems = %u\n", RvObjPoolTotalItems(objpool));
RvPrintf("RvObjPoolFreeItems = %u\n", RvObjPoolFreeItems(objpool));
RvPrintf("RvObjPoolTotalPages = %u\n", RvObjPoolTotalPages(objpool));
RvPoolMemTestGetInfo(®ion);
}
arraysize = RvObjPoolTotalItems(objpool) + 5;
if(arraysize == 5)
arraysize = (RvObjPoolItemsPerPage(objpool) * 3) / 2;
RvMemoryAlloc(NULL, (void *)&blockarray, (RvSize_t)(arraysize * sizeof(void *)));
RvPrintf("Allocating %d items...\n", arraysize);
for(i = 0; i < arraysize; i++) {
result = RvMemoryAlloc(®ion, &blockarray[i], 1);
if(result != RV_OK) {
RvPrintf("Bad Alloc #%d: ", i);
RvPoolMemPrintError(result);
blockarray[i] = NULL;
}
}
RvPrintf("RvObjPoolTotalItems = %u\n", RvObjPoolTotalItems(objpool));
RvPrintf("RvObjPoolFreeItems = %u\n", RvObjPoolFreeItems(objpool));
RvPrintf("RvObjPoolTotalPages = %u\n", RvObjPoolTotalPages(objpool));
RvPoolMemTestGetInfo(®ion);
RvPrintf("Freeing %d items...\n", (arraysize / 2));
for(i = 0; i < (arraysize / 2); i++) {
if(blockarray[i] != NULL) {
result = RvMemoryFree(blockarray[i]);
if(result != RV_OK) {
RvPrintf("Bad Free #%d: ", i);
RvPoolMemPrintError(result);
}
blockarray[i] = NULL;
}
}
RvPrintf("RvObjPoolTotalItems = %u\n", RvObjPoolTotalItems(objpool));
RvPrintf("RvObjPoolFreeItems = %u\n", RvObjPoolFreeItems(objpool));
RvPrintf("RvObjPoolTotalPages = %u\n", RvObjPoolTotalPages(objpool));
RvPoolMemTestGetInfo(®ion);
if(RvObjPoolFreeItems(objpool) != RvObjPoolTotalItems(objpool)) {
RvPrintf("Trying to Destruct Memory Pool: ");
result = RvMemoryDestruct(®ion);
if(result == RV_OK) {
RvPrintf("ERROR! Destruct should have failed.\n");
RvPrintf("++++Pool Test Aborted++++\n");
return;
} else RvPrintf("OK. Didn't destroy pool with allocated blocks.\n");
}
RvPrintf("Freeing rest of items...\n");
for(i = 0; i < arraysize; i++) {
if(blockarray[i] != NULL) {
result = RvMemoryFree(blockarray[i]);
if(result != RV_OK) {
RvPrintf("Bad Free #%d: ", i);
RvPoolMemPrintError(result);
}
blockarray[i] = NULL;
}
}
RvPrintf("RvObjPoolTotalItems = %u\n", RvObjPoolTotalItems(objpool));
RvPrintf("RvObjPoolFreeItems = %u\n", RvObjPoolFreeItems(objpool));
RvPrintf("RvObjPoolTotalPages = %u\n", RvObjPoolTotalPages(objpool));
RvPoolMemTestGetInfo(®ion);
RvPrintf("Destructing Memory Pool: ");
result = RvMemoryDestruct(®ion);
if(result != RV_OK) {
RvPoolMemPrintError(result);
} else RvPrintf("OK.\n");
RvMemoryFree(blockarray);
RvPrintf("++++Memory Pool test completed++++\n");
}
void RvPoolMemTest(void)
{
RvPoolMemAttr poolconfig;
/* Initialize other needed modules */
RvSemaphoreInit();
RvLockInit();
RvMemoryInit(); /* Calls RvPoolMemInit */
RvPrintf("Starting test of rvpoolmem.\n");
poolconfig.pooltype = RV_POOLMEM_TYPE_FIXED;
poolconfig.pageblocks = 15;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 35;
poolconfig.startpages = 0;
RvPoolMemTestPool(500, &poolconfig, "FIXED 500");
poolconfig.pooltype = RV_POOLMEM_TYPE_FIXED;
poolconfig.pageblocks = 0;
poolconfig.pagesize = 100;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 2;
RvPoolMemTestPool(2, &poolconfig, "FIXED 2");
poolconfig.pooltype = RV_POOLMEM_TYPE_FIXED;
poolconfig.pageblocks = 15;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 10;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 2;
RvPoolMemTestPool(10, &poolconfig, "FIXED 10");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 17;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 0;
RvPoolMemTestPool(150, &poolconfig, "EXPANDING 150");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 0;
poolconfig.pagesize = 32000;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 0;
RvPoolMemTestPool(1024, &poolconfig, "EXPANDING 1024");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 17;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 40;
poolconfig.minblocks = 10;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 0;
RvPoolMemTestPool(50, &poolconfig, "EXPANDING 50");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 10;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 50;
poolconfig.minblocks = 15;
poolconfig.freelevel = 0;
poolconfig.startblocks = 10;
poolconfig.startpages = 0;
RvPoolMemTestPool(75, &poolconfig, "EXPANDING 75");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 10;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 42;
poolconfig.minblocks = 15;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 4;
RvPoolMemTestPool(88, &poolconfig, "EXPANDING 88");
RvPrintf("This is a bad configuration, should fail.\n");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 0;
poolconfig.pagesize = 500;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 0;
RvPoolMemTestPool(1024, &poolconfig, "EXPANDING BAD");
RvPrintf("This is a bad configuration, should fail.\n");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 0;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 0;
RvPoolMemTestPool(1024, &poolconfig, "EXPANDING BAD");
RvPrintf("This is a bad configuration, should fail.\n");
poolconfig.pooltype = RV_POOLMEM_TYPE_EXPANDING;
poolconfig.pageblocks = 20;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 30;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 2;
RvPoolMemTestPool(25, &poolconfig, "EXPANDING BAD");
poolconfig.pooltype = RV_POOLMEM_TYPE_DYNAMIC;
poolconfig.pageblocks = 120;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 0;
poolconfig.startblocks = 0;
poolconfig.startpages = 0;
RvPoolMemTestPool(32, &poolconfig, "DYNAMIC 32");
poolconfig.pooltype = RV_POOLMEM_TYPE_DYNAMIC;
poolconfig.pageblocks = 0;
poolconfig.pagesize = 1024;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 40;
poolconfig.startblocks = 0;
poolconfig.startpages = 1;
RvPoolMemTestPool(100, &poolconfig, "DYNAMIC 100");
poolconfig.pooltype = RV_POOLMEM_TYPE_DYNAMIC;
poolconfig.pageblocks = 100;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 0;
poolconfig.freelevel = 30;
poolconfig.startblocks = 2000;
poolconfig.startpages = 0;
RvPoolMemTestPool(85, &poolconfig, "DYNAMIC 85");
poolconfig.pooltype = RV_POOLMEM_TYPE_DYNAMIC;
poolconfig.pageblocks = 100;
poolconfig.pagesize = 0;
poolconfig.maxblocks = 0;
poolconfig.minblocks = 150;
poolconfig.freelevel = 30;
poolconfig.startblocks = 300;
poolconfig.startpages = 0;
RvPoolMemTestPool(65, &poolconfig, "DYNAMIC 65");
RvMemoryEnd(); /* calls RvPoolMemEnd */
/* Shut down other needed modules */
RvLockEnd();
RvSemaphoreEnd();
}
#endif /* RV_TEST_CODE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -