⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rvpoolmem.c

📁 基于h323协议的软phone
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 = &region.driverData.poolMemData.objpool; /* cheat to check internals */

	RvPrintf("RvMemoryConstruct: ");
	/* Pages from default allocator and no out-of-memory callback */
	result = RvMemoryConstruct(&region, 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(&region);
	
	RvPrintf("RvMemoryAlloc: ");
	result = RvMemoryAlloc(&region, &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(&region);

	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(&region);
	}

	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(&region, &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(&region);

	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(&region);

	if(RvObjPoolFreeItems(objpool) != RvObjPoolTotalItems(objpool)) {
		RvPrintf("Trying to Destruct Memory Pool: ");
		result = RvMemoryDestruct(&region);
		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(&region);

	RvPrintf("Destructing Memory Pool: ");
	result = RvMemoryDestruct(&region);
	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 + -