public abstract AcquirePagePointer ( long pageNumber, PagerState pagerState = null ) : byte* | ||
pageNumber | long | |
pagerState | PagerState | |
return | byte* |
public void Write(long posBy4Kbs, int numberOf4Kbs, byte *source) { const int pageSizeTo4KbRatio = (Constants.Storage.PageSize / (4 * Constants.Size.Kilobyte)); var pageNumber = posBy4Kbs / pageSizeTo4KbRatio; var offsetBy4Kb = posBy4Kbs % pageSizeTo4KbRatio; var numberOfPages = numberOf4Kbs / pageSizeTo4KbRatio; if (numberOf4Kbs % pageSizeTo4KbRatio != 0) { numberOfPages++; } var newPagerState = _abstractPager.EnsureContinuous(pageNumber, numberOfPages); if (newPagerState != null) { _pagerState.Release(); newPagerState.AddRef(); _pagerState = newPagerState; } var toWrite = numberOf4Kbs * 4 * Constants.Size.Kilobyte; byte *destination = _abstractPager.AcquirePagePointer(null, pageNumber, _pagerState) + (offsetBy4Kb * 4 * Constants.Size.Kilobyte); _abstractPager.UnprotectPageRange(destination, (ulong)toWrite); Memory.Copy(destination, source, toWrite); _abstractPager.ProtectPageRange(destination, (ulong)toWrite); }
public static byte *AcquirePagePointerWithOverflowHandling <T>(this AbstractPager pager, T tx, long pageNumber) where T : IPagerLevelTransactionState { // Case 1: Page is not overflow ==> no problem, returning a pointer to existing mapping var pageHeader = (PageHeader *)pager.AcquirePagePointer(tx, pageNumber); if ((pageHeader->Flags & PageFlags.Overflow) != PageFlags.Overflow) { return((byte *)pageHeader); } // Case 2: Page is overflow and already mapped large enough ==> no problem, returning a pointer to existing mapping if (pager.EnsureMapped(tx, pageNumber, GetNumberOfOverflowPages(pageHeader->OverflowSize)) == false) { return((byte *)pageHeader); } // Case 3: Page is overflow and was ensuredMapped above, view was re-mapped so we need to acquire a pointer to the new mapping. return(pager.AcquirePagePointer(tx, pageNumber)); }
public void Write(long pageNumber, int numberOfPages, byte *source) { var newPagerState = _abstractPager.EnsureContinuous(pageNumber, numberOfPages); if (newPagerState != null) { _pagerState.Release(); newPagerState.AddRef(); _pagerState = newPagerState; } var toWrite = numberOfPages * _abstractPager.PageSize; byte *destination = _abstractPager.AcquirePagePointer(null, pageNumber, _pagerState); _abstractPager.UnprotectPageRange(destination, (ulong)toWrite); Memory.BulkCopy(destination, source, toWrite); _abstractPager.ProtectPageRange(destination, (ulong)toWrite); }
public static Page ReadPage(this AbstractPager pager, LowLevelTransaction tx, long pageNumber, PagerState pagerState = null) { return(new Page(pager.AcquirePagePointer(tx, pageNumber, pagerState), pager)); }
public static TreePage Read(this AbstractPager pager, LowLevelTransaction tx, long pageNumber, PagerState pagerState = null) { return(new TreePage(pager.AcquirePagePointer(tx, pageNumber, pagerState), pager.DebugInfo, pager.PageSize)); }