void checkPageKill() { cerr << fmtTitle("kill", '.') << endl; typedef BlockPage<Policy> Page; array<void*, Page::NumBlocks> blocks; auto& log = Page::log; locklessCheck(createPage<Policy>()->kill(), log); { Page* page = createPage<Policy>(); for (size_t i = 0; i < Page::NumBlocks; ++i) blocks[i] = page->alloc(); locklessCheck(!page->kill(), log); for (size_t i = 0; i < Page::NumBlocks; ++i) locklessCheckEq( page->free(blocks[i]), i == Page::NumBlocks - 1, log); } { Page* page = createPage<Policy>(); for (size_t i = 0; i < Page::NumBlocks; ++i) blocks[i] = page->alloc(); for (size_t i = 0; i < Page::NumBlocks / 2; ++i) locklessCheckEq( page->free(blocks[i]), i == Page::NumBlocks - 1, log); locklessCheck(!page->kill(), log); for (size_t i = Page::NumBlocks / 2; i < Page::NumBlocks; ++i) locklessCheckEq( page->free(blocks[i]), i == Page::NumBlocks - 1, log); } { Page* page = createPage<Policy>(); for (size_t i = 0; i < Page::NumBlocks; ++i) blocks[i] = page->alloc(); for (size_t i = 0; i < Page::NumBlocks; ++i) locklessCheck(!page->free(blocks[i]), log); locklessCheck(page->kill(), log); } }
void checkPageAlloc() { cerr << fmtTitle("alloc", '.') << endl; typedef BlockPage<Policy> Page; Page* page = createPage<Policy>(); auto& log = Page::log; array<void*, Page::NumBlocks> blocks; for (size_t i = 0; i < Page::NumBlocks; ++i) { locklessCheck(page->hasFreeBlock(), log); void* block = page->alloc(); fillBlock<Policy>(block, i); page->free(blocks[i] = block); if (!i) { locklessCheckEq( uintptr_t(page) + (Page::MetadataBlocks * Policy::BlockSize), uintptr_t(blocks[0]), log); } else { locklessCheckGt(blocks[i], page, log); locklessCheckLe( uintptr_t(blocks[i]) + Policy::BlockSize, uintptr_t(page) + Policy::PageSize, log); locklessCheckEq( uintptr_t(blocks[i-1]) + Policy::BlockSize, uintptr_t(blocks[i]), log); } locklessCheckEq(page, Page::pageForBlock(blocks[i]), log); } for (size_t iteration = 0; iteration < 2; ++iteration) { for (size_t i = 0; i < Page::NumBlocks; ++i) locklessCheckEq(blocks[i], page->alloc(), log); for (size_t i = 0; i < Page::NumBlocks; ++i) page->free(blocks[i]); } locklessCheck(page->kill(), log); }
void multipleAllocFreeTest() { int i; Page *page; uint32_t ps = ((LocalEnvironment *)m_env)->config().page_size_bytes; for (i = 0; i < 10; i++) { page = new Page(((LocalEnvironment *)m_env)->device()); page->alloc(0, ps); /* i+2 since we need 1 page for the header page and one page * for the root page */ if (!m_inmemory) REQUIRE(page->get_address() == (i + 2) * ps); delete page; } }
void checkPageFull() { cerr << fmtTitle("full", '.') << endl; typedef BlockPage<Policy> Page; Page* page = createPage<Policy>(); array<void*, Page::NumBlocks> blocks; for (size_t i = 0; i < Page::NumBlocks; ++i) page->free(blocks[i] = page->alloc()); for (size_t k = 1; k < Page::NumBlocks; ++k) { for (size_t i = 0; i < Page::NumBlocks; ++i) page->alloc(); locklessCheck(!page->hasFreeBlock(), NullLog); for (size_t i = 0; i < Page::NumBlocks; i += k) page->free(blocks[i]); locklessCheck(page->hasFreeBlock(), NullLog); for (size_t i = 0; i < Page::NumBlocks; i += k) page->alloc(); locklessCheck(!page->hasFreeBlock(), NullLog); for (size_t i = 0; i < Page::NumBlocks; ++i) page->free(blocks[i]); locklessCheck(page->hasFreeBlock(), NullLog); } locklessCheck(page->kill(), NullLog); }
void allocFreeTest() { Page *page; page = new Page(((LocalEnvironment *)m_env)->device()); page->alloc(0, 1024); delete page; }