示例#1
0
        static void TestFreeList()
        {
            string dbPath = "./testdbfile.minidb";

            File.Delete(dbPath);

            Pager pager = new Pager(dbPath, 4096, 100);

            List <MemoryPage> pageList = new List <MemoryPage>();

            pageList.Add(pager.GetNewPage());  // page #2
            pageList.Add(pager.GetNewPage());  // page #3
            pageList.Add(pager.GetNewPage());  // page #4
            pageList.Add(pager.GetNewPage());  // page #5

            FreeList freeList = new FreeList(pager);

            // test initialization
            MemoryPage newPage = null;

            newPage = freeList.AllocatePage();  // freeList is now empty
            Assert.Null(newPage);

            // recycle pages
            // MemoryPage tempPage = pager.ReadPage(3);
            freeList.RecyclePage(pageList[2]);  // freeList->4
            freeList.RecyclePage(pageList[1]);  // freeList->3->4
            freeList.RecyclePage(pageList[3]);  // freeList->5->3->4

            // fetch page from free list
            newPage = freeList.AllocatePage();  // freeList->3->4
            Assert.Equal(5, newPage.PageNumber);
            newPage = freeList.AllocatePage();  // freeList->4
            Assert.Equal(3, newPage.PageNumber);

            // recycle a page
            freeList.RecyclePage(pageList[3]);  // freeList->5->4

            // fetch remaining pages
            newPage = freeList.AllocatePage();  // freeList->4
            Assert.Equal(5, newPage.PageNumber);
            newPage = freeList.AllocatePage();  // freeList->null
            Assert.Equal(4, newPage.PageNumber);
            newPage = freeList.AllocatePage();  // freeList->null
            Assert.Null(newPage);

            pager.Close();
        }
示例#2
0
        // recycle page to free list
        private void DeleteNode(BTreeNode node)
        {
            MemoryPage page = node.RawPage;

            node.IsDisabled = true;
            _freeList.RecyclePage(page);
        }