Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        public void Release()
        {
            if (_tx == null)
            {
                return;
            }

            _tx.Allocator.Release(ref _cacheMemory);
            _tx    = null;
            _cache = null;
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }