public virtual int CopyPage(I4KbBatchWrites destI4KbBatchWrites, int scratchNumber, long p, PagerState pagerState) { var item = GetScratchBufferFile(scratchNumber); ScratchBufferFile bufferFile = item.File; return(bufferFile.CopyPage(destI4KbBatchWrites, p, pagerState)); }
protected int CopyPageImpl(I4KbBatchWrites destwI4KbBatchWrites, long p, PagerState pagerState) { var src = AcquirePagePointer(null, p, pagerState); var pageHeader = (PageHeader *)src; int numberOfPages = 1; if ((pageHeader->Flags & PageFlags.Overflow) == PageFlags.Overflow) { numberOfPages = VirtualPagerLegacyExtensions.GetNumberOfOverflowPages(pageHeader->OverflowSize); } const int adjustPageSize = (Constants.Storage.PageSize) / (4 * Constants.Size.Kilobyte); destwI4KbBatchWrites.Write(pageHeader->PageNumber * (long)adjustPageSize, numberOfPages * adjustPageSize, src); return(numberOfPages); }
public override int CopyPage(I4KbBatchWrites destwI4KbBatchWrites, long p, PagerState pagerState) { return(CopyPageImpl(destwI4KbBatchWrites, p, pagerState)); }
public override int CopyPage(I4KbBatchWrites destI4KbBatchWrites, long pageNumber, PagerState pagerState) { long sizeToMap = AllocationGranularity; var distanceFromStart = (pageNumber % NumberOfPagesInAllocationGranularity); var allocationStartPosition = pageNumber - distanceFromStart; var offset = allocationStartPosition * Constants.Storage.PageSize; var mmflags = _copyOnWriteMode ? MmapFlags.MAP_PRIVATE : MmapFlags.MAP_SHARED; var result = Syscall.mmap64(IntPtr.Zero, (UIntPtr)sizeToMap, MmapProts.PROT_READ | MmapProts.PROT_WRITE, mmflags, _fd, offset); try { if (result.ToInt64() == -1) //system didn't succeed in mapping the address where we wanted { var err = Marshal.GetLastWin32Error(); Syscall.ThrowLastError(err, $"Unable to map (default view size) {sizeToMap / Constants.Size.Kilobyte:#,#0} kb for page {pageNumber} starting at {allocationStartPosition} on {FileName}"); } var pageHeader = (PageHeader *)(result.ToInt64() + distanceFromStart * Constants.Storage.PageSize); int numberOfPages = 1; if ((pageHeader->Flags & PageFlags.Overflow) == PageFlags.Overflow) { numberOfPages = VirtualPagerLegacyExtensions.GetNumberOfOverflowPages(pageHeader->OverflowSize); } if (numberOfPages + distanceFromStart > NumberOfPagesInAllocationGranularity) { Syscall.munmap(result, (UIntPtr)sizeToMap); result = new IntPtr(-1); sizeToMap = NearestSizeToAllocationGranularity((numberOfPages + distanceFromStart) * Constants.Storage.PageSize); result = Syscall.mmap64(IntPtr.Zero, (UIntPtr)sizeToMap, MmapProts.PROT_READ | MmapProts.PROT_WRITE, mmflags, _fd, offset); if (result.ToInt64() == -1) { var err = Marshal.GetLastWin32Error(); Syscall.ThrowLastError(err, $"Unable to map {sizeToMap / Constants.Size.Kilobyte:#,#0} kb for page {pageNumber} starting at {allocationStartPosition} on {FileName}"); } pageHeader = (PageHeader *)(result.ToInt64() + (distanceFromStart * Constants.Storage.PageSize)); } const int adjustPageSize = (Constants.Storage.PageSize) / (4 * Constants.Size.Kilobyte); destI4KbBatchWrites.Write(pageHeader->PageNumber * adjustPageSize, numberOfPages * adjustPageSize, (byte *)pageHeader); return(numberOfPages); } finally { if (result.ToInt64() != -1) { Syscall.munmap(result, (UIntPtr)sizeToMap); } } }
public int CopyPage(I4KbBatchWrites destI4KbBatchWrites, long p, PagerState pagerState) { return(_scratchPager.CopyPage(destI4KbBatchWrites, p, pagerState)); }
public override int CopyPage(I4KbBatchWrites destI4KbBatchWrites, long pageNumber, PagerState pagerState) { var distanceFromStart = (pageNumber % NumberOfPagesInAllocationGranularity); var allocationStartPosition = pageNumber - distanceFromStart; var offset = new WindowsMemoryMapPager.SplitValue { Value = (ulong)allocationStartPosition * (ulong)Constants.Storage.PageSize }; var result = MapViewOfFileEx(_hFileMappingObject, _mmFileAccessType, offset.High, offset.Low, (UIntPtr)AllocationGranularity, null); try { if (result == null) { var lastWin32Error = Marshal.GetLastWin32Error(); throw new Win32Exception($"Unable to map (default view size) {AllocationGranularity / Constants.Size.Kilobyte:#,#0} kb for page {pageNumber} starting at {allocationStartPosition} on {FileName}", new Win32Exception(lastWin32Error)); } var pageHeader = (PageHeader *)(result + distanceFromStart * Constants.Storage.PageSize); int numberOfPages = 1; if ((pageHeader->Flags & PageFlags.Overflow) == PageFlags.Overflow) { numberOfPages = VirtualPagerLegacyExtensions.GetNumberOfOverflowPages(pageHeader->OverflowSize); } if (numberOfPages + distanceFromStart > NumberOfPagesInAllocationGranularity) { UnmapViewOfFile(result); result = null; var newSize = NearestSizeToAllocationGranularity((numberOfPages + distanceFromStart) * Constants.Storage.PageSize); result = MapViewOfFileEx(_hFileMappingObject, _mmFileAccessType, offset.High, offset.Low, (UIntPtr)newSize, null); if (result == null) { var lastWin32Error = Marshal.GetLastWin32Error(); throw new Win32Exception($"Unable to map {newSize / Constants.Size.Kilobyte:#,#0} kb for page {pageNumber} starting at {allocationStartPosition} on {FileName}", new Win32Exception(lastWin32Error)); } pageHeader = (PageHeader *)(result + (distanceFromStart * Constants.Storage.PageSize)); } const int adjustPageSize = (Constants.Storage.PageSize) / (4 * Constants.Size.Kilobyte); destI4KbBatchWrites.Write(pageHeader->PageNumber * adjustPageSize, numberOfPages * adjustPageSize, (byte *)pageHeader); return(numberOfPages); } finally { if (result != null) { UnmapViewOfFile(result); } } }
public abstract int CopyPage(I4KbBatchWrites destwI4KbBatchWrites, long p, PagerState pagerState);