AcquirePagePointer() public abstract method

public abstract AcquirePagePointer ( long pageNumber, PagerState pagerState = null ) : byte*
pageNumber long
pagerState PagerState
return byte*
Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 public static Page ReadPage(this AbstractPager pager, LowLevelTransaction tx, long pageNumber, PagerState pagerState = null)
 {
     return(new Page(pager.AcquirePagePointer(tx, pageNumber, pagerState), pager));
 }
Ejemplo n.º 5
0
 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));
 }