public PageLocatorCurrent(LowLevelTransactionStub tx, int cacheSize = 8) { //Debug.Assert(tx != null); //Debug.Assert(cacheSize > 0); _tx = tx; if (tx != null) { Debug.Fail(""); } cacheSize = Bits.NextPowerOf2(cacheSize); if (cacheSize > 1024) { cacheSize = 1024; } int shiftRight = Bits.CeilLog2(cacheSize); _andMask = (int)(0xFFFFFFFF >> (sizeof(uint) * 8 - shiftRight)); _tx = tx; _allocator.Allocate(cacheSize * sizeof(PageData), out _cacheMemory); _cache = (PageData *)_cacheMemory.Ptr; for (var i = 0; i < cacheSize; i++) { _cache[i].PageNumber = Invalid; } }
public void Renew(LowLevelTransaction tx, int cacheSize) { Debug.Assert(tx != null); Debug.Assert(cacheSize > 0); Debug.Assert(cacheSize <= 1024); if (!Bits.IsPowerOfTwo(cacheSize)) { cacheSize = Bits.NextPowerOf2(cacheSize); } int shiftRight = Bits.CeilLog2(cacheSize); _andMask = (int)(0xFFFFFFFF >> (sizeof(uint) * 8 - shiftRight)); _tx = tx; tx.Allocator.Allocate(cacheSize * sizeof(PageData), out _cacheMemory); _cache = (PageData *)_cacheMemory.Ptr; for (var i = 0; i < cacheSize; i++) { _cache[i].PageNumber = Invalid; } }
public void Release() { if (_tx == null) { return; } _tx.Allocator.Release(ref _cacheMemory); _tx = null; _cache = null; }
public void SetWritable(long pageNumber, Page page) { var position = pageNumber & _andMask; PageData *node = &_cache[position]; if (node->PageNumber != pageNumber || node->IsWritable == false) { node->PageNumber = pageNumber; node->Page = page; node->IsWritable = true; } }
public bool TryGetWritablePage(long pageNumber, out Page page) { var position = pageNumber & _andMask; PageData *node = &_cache[position]; if (node->IsWritable && node->PageNumber == pageNumber && node->PageNumber != Invalid) { page = node->Page; return(true); } page = default(Page); return(false); }
public bool TryGetReadOnlyPage(long pageNumber, out Page page) { var position = pageNumber & _andMask; PageData *node = &_cache[position]; if (node->PageNumber == pageNumber) { page = node->Page; return(true); } page = default(Page); return(false); }
public MyPageStruct GetWritablePage(long pageNumber) { var position = pageNumber & _andMask; PageData *node = &_cache[position]; if (node->IsWritable && node->PageNumber == pageNumber) { return(node->Page); } var page = LowLevelTransactionStub.ModifyPageStruct(pageNumber); node->PageNumber = pageNumber; node->Page = page; node->IsWritable = true; return(page); }
public Page GetReadOnlyPage(long pageNumber) { var position = pageNumber & _andMask; PageData *node = &_cache[position]; if (node->PageNumber == pageNumber) { return(node->Page); } var page = _tx.GetPage(pageNumber); node->PageNumber = pageNumber; node->Page = page; node->IsWritable = false; return(page); }
public Page GetWritablePage(long pageNumber) { var position = pageNumber & _andMask; PageData *node = &_cache[position]; if (node->IsWritable && node->PageNumber == pageNumber) { return(node->Page); } var page = _tx.ModifyPage(pageNumber); node->PageNumber = pageNumber; node->Page = page; node->IsWritable = true; return(page); }