void BlockCacheConcurrencyTest::TestBlockCache(BBlockCache *theCache, bool isMallocTest) { BList cacheList; BList nonCacheList; thread_id theThread = find_thread(NULL); // Do everything eight times to ensure the test runs long // enough to check for concurrency problems. for (int j = 0; j < 8; j++) { // Perform a series of gets, saves and frees for (int i = 0; i < numBlocksInCache / 2; i++) { GetBlock(theCache, sizeOfBlocksInCache, theThread, &cacheList, &nonCacheList); GetBlock(theCache, sizeOfBlocksInCache, theThread, &cacheList, &nonCacheList); GetBlock(theCache, sizeOfNonCacheBlocks, theThread, &cacheList, &nonCacheList); GetBlock(theCache, sizeOfNonCacheBlocks, theThread, &cacheList, &nonCacheList); SaveBlock(theCache, cacheList.ItemAt(cacheList.CountItems() / 2), sizeOfBlocksInCache, theThread, &cacheList, &nonCacheList); SaveBlock(theCache, nonCacheList.ItemAt(nonCacheList.CountItems() / 2), sizeOfNonCacheBlocks, theThread, &cacheList, &nonCacheList); GetBlock(theCache, sizeOfBlocksInCache, theThread, &cacheList, &nonCacheList); GetBlock(theCache, sizeOfBlocksInCache, theThread, &cacheList, &nonCacheList); GetBlock(theCache, sizeOfNonCacheBlocks, theThread, &cacheList, &nonCacheList); GetBlock(theCache, sizeOfNonCacheBlocks, theThread, &cacheList, &nonCacheList); FreeBlock(cacheList.ItemAt(cacheList.CountItems() / 2), sizeOfBlocksInCache, isMallocTest, theThread, &cacheList, &nonCacheList); FreeBlock(nonCacheList.ItemAt(nonCacheList.CountItems() / 2), sizeOfNonCacheBlocks, isMallocTest, theThread, &cacheList, &nonCacheList); } bool performFree = false; // Free or save (every other block) for all "cache sized" blocks. while (!cacheList.IsEmpty()) { if (performFree) { FreeBlock(cacheList.LastItem(), sizeOfBlocksInCache, isMallocTest, theThread, &cacheList, &nonCacheList); } else { SaveBlock(theCache, cacheList.LastItem(), sizeOfBlocksInCache, theThread, &cacheList, &nonCacheList); } performFree = !performFree; } // Free or save (every other block) for all "non-cache sized" blocks. while (!nonCacheList.IsEmpty()) { if (performFree) { FreeBlock(nonCacheList.LastItem(), sizeOfNonCacheBlocks, isMallocTest, theThread, &cacheList, &nonCacheList); } else { SaveBlock(theCache, nonCacheList.LastItem(), sizeOfNonCacheBlocks, theThread, &cacheList, &nonCacheList); } performFree = !performFree; } } }