Example #1
0
        private unsafe Page AllocateMoreSpace(FixedSizeTree fst)
        {
            int numberOfPagesToAllocate = GetNumberOfPagesToAllocate();

            var allocatePage = _llt.AllocatePage(numberOfPagesToAllocate);

            _llt.BreakLargeAllocationToSeparatePages(allocatePage.PageNumber);

            var initialPageNumber = allocatePage.PageNumber;

            bool  isNew;
            byte *ptr;

            using (fst.DirectAdd(initialPageNumber, out isNew, out ptr))
            {
                if (isNew == false)
                {
                    ThrowInvalidExistingBuffer();
                }

                // in 32 bits, we pre-allocate just 256 KB, not 2MB
                Debug.Assert(numberOfPagesToAllocate % 8 == 0);
                Debug.Assert(numberOfPagesToAllocate % 8 <= BitmapSize);
                Memory.Set(ptr, 0xFF, BitmapSize);               // mark the pages that we haven't allocated as busy
                Memory.Set(ptr, 0, numberOfPagesToAllocate / 8); // mark just the first part as free
            }
            return(allocatePage);
        }
Example #2
0
        private unsafe void UnsetValue(FixedSizeTree fst, long pageNumber, int positionInBitmap)
        {
            bool  isNew;
            byte *ptr;

            using (fst.DirectAdd(pageNumber, out isNew, out ptr))
            {
                if (isNew)
                {
                    ThrowInvalidNewBuffer();
                }

                PtrBitVector.SetBitInPointer(ptr, positionInBitmap, false);
                // ptr[positionInBitmap / 8] &= (byte) ~(1 << (positionInBitmap % 8));
            }
        }
Example #3
0
        private unsafe Page AllocateMoreSpace(FixedSizeTree fst)
        {
            var allocatePage = _llt.AllocatePage(NumberOfPagesInSection);

            _llt.BreakLargeAllocationToSeparatePages(allocatePage.PageNumber);

            var initialPageNumber = allocatePage.PageNumber;

            bool  isNew;
            byte *ptr;

            using (fst.DirectAdd(initialPageNumber, out isNew, out ptr))
            {
                if (isNew == false)
                {
                    ThrowInvalidExistingBuffer();
                }
                Memory.Set(ptr, 0, BitmapSize); // mark all pages as free
            }
            return(allocatePage);
        }