/// <summary> /// Read pages from specified device /// </summary> /// <typeparam name="TContext"></typeparam> /// <param name="readPageStart"></param> /// <param name="numPages"></param> /// <param name="untilAddress"></param> /// <param name="callback"></param> /// <param name="context"></param> /// <param name="frame"></param> /// <param name="completed"></param> /// <param name="devicePageOffset"></param> /// <param name="device"></param> /// <param name="objectLogDevice"></param> internal void AsyncReadPagesFromDeviceToFrame <TContext>( long readPageStart, int numPages, long untilAddress, IOCompletionCallback callback, TContext context, BlittableFrame frame, out CountdownEvent completed, long devicePageOffset = 0, IDevice device = null, IDevice objectLogDevice = null) { var usedDevice = device; IDevice usedObjlogDevice = objectLogDevice; if (device == null) { usedDevice = this.device; } completed = new CountdownEvent(numPages); for (long readPage = readPageStart; readPage < (readPageStart + numPages); readPage++) { int pageIndex = (int)(readPage % frame.frameSize); if (frame.frame[pageIndex] == null) { frame.Allocate(pageIndex); } else { frame.Clear(pageIndex); } var asyncResult = new PageAsyncReadResult <TContext>() { page = readPage, context = context, handle = completed, frame = frame }; ulong offsetInFile = (ulong)(AlignedPageSizeBytes * readPage); uint readLength = (uint)AlignedPageSizeBytes; long adjustedUntilAddress = (AlignedPageSizeBytes * (untilAddress >> LogPageSizeBits) + (untilAddress & PageSizeMask)); if (adjustedUntilAddress > 0 && ((adjustedUntilAddress - (long)offsetInFile) < PageSize)) { readLength = (uint)(adjustedUntilAddress - (long)offsetInFile); readLength = (uint)((readLength + (sectorSize - 1)) & ~(sectorSize - 1)); } if (device != null) { offsetInFile = (ulong)(AlignedPageSizeBytes * (readPage - devicePageOffset)); } usedDevice.ReadAsync(offsetInFile, (IntPtr)frame.pointers[pageIndex], readLength, callback, asyncResult); } }
/// <summary> /// Read pages from specified device /// </summary> /// <typeparam name="TContext"></typeparam> /// <param name="readPageStart"></param> /// <param name="numPages"></param> /// <param name="callback"></param> /// <param name="context"></param> /// <param name="frame"></param> /// <param name="completed"></param> /// <param name="devicePageOffset"></param> /// <param name="device"></param> /// <param name="objectLogDevice"></param> internal void AsyncReadPagesFromDeviceToFrame <TContext>( long readPageStart, int numPages, IOCompletionCallback callback, TContext context, BlittableFrame frame, out CountdownEvent completed, long devicePageOffset = 0, IDevice device = null, IDevice objectLogDevice = null) { var usedDevice = device; IDevice usedObjlogDevice = objectLogDevice; if (device == null) { usedDevice = this.device; } completed = new CountdownEvent(numPages); for (long readPage = readPageStart; readPage < (readPageStart + numPages); readPage++) { int pageIndex = (int)(readPage % frame.frameSize); if (frame.frame[pageIndex] == null) { frame.Allocate(pageIndex); } else { frame.Clear(pageIndex); } var asyncResult = new PageAsyncReadResult <TContext>() { page = readPage, context = context, handle = completed, count = 1, frame = frame }; ulong offsetInFile = (ulong)(AlignedPageSizeBytes * readPage); if (device != null) { offsetInFile = (ulong)(AlignedPageSizeBytes * (readPage - devicePageOffset)); } usedDevice.ReadAsync(offsetInFile, (IntPtr)frame.pointers[pageIndex], (uint)AlignedPageSizeBytes, callback, asyncResult); } }
internal override void AsyncReadPagesFromDeviceToFrame <TContext>(long readPageStart, int numPages, long untilAddress, TContext context, out CountdownEvent completed, long devicePageOffset = 0, IDevice device = null, IDevice objectLogDevice = null, CancellationTokenSource cts = null) { IDevice usedDevice = deltaLogDevice; completed = new CountdownEvent(numPages); for (long readPage = readPageStart; readPage < (readPageStart + numPages); readPage++) { int pageIndex = (int)(readPage % frame.frameSize); if (frame.frame[pageIndex] == null) { frame.Allocate(pageIndex); } else { frame.Clear(pageIndex); } var asyncResult = new PageAsyncReadResult <TContext>() { page = readPage, context = context, handle = completed, frame = frame }; ulong offsetInFile = (ulong)(AlignedPageSizeBytes * readPage); uint readLength = (uint)AlignedPageSizeBytes; long adjustedUntilAddress = (AlignedPageSizeBytes * (untilAddress >> LogPageSizeBits) + (untilAddress & PageSizeMask)); if (adjustedUntilAddress > 0 && ((adjustedUntilAddress - (long)offsetInFile) < PageSize)) { readLength = (uint)(adjustedUntilAddress - (long)offsetInFile); readLength = (uint)(Align(readLength)); } if (device != null) { offsetInFile = (ulong)(AlignedPageSizeBytes * (readPage - devicePageOffset)); } usedDevice.ReadAsync(offsetInFile, (IntPtr)frame.pointers[pageIndex], readLength, AsyncReadPagesCallback, asyncResult); } }