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); }
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)); } }
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); }