Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ WriteAsyncInternalCore()

unsafe Task System.IO.Strategies.Net5CompatFileStreamStrategy.WriteAsyncInternalCore ( ReadOnlyMemory< byte > source,
CancellationToken cancellationToken )
inlineprivate

Definition at line 1101 of file Net5CompatFileStreamStrategy.cs.

1102 {
1103 CompletionSource completionSource = CompletionSource.Create(this, _preallocatedOverlapped, 0, source);
1104 NativeOverlapped* overlapped = completionSource.Overlapped;
1105 if (CanSeek)
1106 {
1107 long length = Length;
1109 if (_filePosition + source.Length > length)
1110 {
1112 }
1113 overlapped->OffsetLow = (int)_filePosition;
1114 overlapped->OffsetHigh = (int)(_filePosition >> 32);
1115 SeekCore(_fileHandle, source.Length, SeekOrigin.Current);
1116 }
1117 int errorCode;
1118 int num = WriteFileNative(_fileHandle, source.Span, overlapped, out errorCode);
1119 if (num == -1)
1120 {
1121 switch (errorCode)
1122 {
1123 case 232:
1124 completionSource.SetCompletedSynchronously(0);
1125 return Task.CompletedTask;
1126 default:
1128 {
1129 SeekCore(_fileHandle, 0L, SeekOrigin.Current);
1130 }
1131 completionSource.ReleaseNativeResource();
1132 if (errorCode == 38)
1133 {
1134 ThrowHelper.ThrowEndOfFileException();
1135 break;
1136 }
1137 throw Win32Marshal.GetExceptionForWin32Error(errorCode, _fileHandle.Path);
1138 case 997:
1139 if (cancellationToken.CanBeCanceled)
1140 {
1141 completionSource.RegisterForCancellation(cancellationToken);
1142 }
1143 break;
1144 }
1145 }
1146 return completionSource.Task;
1147 }
unsafe int WriteFileNative(SafeFileHandle handle, ReadOnlySpan< byte > buffer, NativeOverlapped *overlapped, out int errorCode)
long SeekCore(SafeFileHandle fileHandle, long offset, SeekOrigin origin, bool closeInvalidHandle=false)
static Task CompletedTask
Definition Task.cs:1120

References System.IO.Strategies.Net5CompatFileStreamStrategy._fileHandle, System.IO.Strategies.Net5CompatFileStreamStrategy._filePosition, System.IO.Strategies.Net5CompatFileStreamStrategy._preallocatedOverlapped, System.cancellationToken, System.IO.Strategies.Net5CompatFileStreamStrategy.CanSeek, System.Threading.Tasks.Task< TResult >.CompletedTask, System.IO.Strategies.Net5CompatFileStreamStrategy.CompletionSource.Create(), System.IO.Win32Marshal.GetExceptionForWin32Error(), System.Runtime.InteropServices.SafeHandle.IsClosed, System.L, System.length, System.IO.Strategies.Net5CompatFileStreamStrategy.Length, System.Threading.NativeOverlapped.OffsetHigh, System.Threading.NativeOverlapped.OffsetLow, System.IO.Strategies.Net5CompatFileStreamStrategy.CompletionSource.Overlapped, Microsoft.Win32.SafeHandles.SafeFileHandle.Path, System.IO.Strategies.Net5CompatFileStreamStrategy.CompletionSource.RegisterForCancellation(), System.IO.Strategies.Net5CompatFileStreamStrategy.CompletionSource.ReleaseNativeResource(), System.IO.Strategies.Net5CompatFileStreamStrategy.SeekCore(), System.IO.Strategies.Net5CompatFileStreamStrategy.CompletionSource.SetCompletedSynchronously(), System.IO.Strategies.Net5CompatFileStreamStrategy.SetLengthCore(), System.source, System.Threading.Tasks.TaskCompletionSource< TResult >.Task, System.ThrowHelper.ThrowEndOfFileException(), System.IO.Strategies.Net5CompatFileStreamStrategy.VerifyOSHandlePosition(), and System.IO.Strategies.Net5CompatFileStreamStrategy.WriteFileNative().

Referenced by System.IO.Strategies.Net5CompatFileStreamStrategy.FlushWriteAsync(), and System.IO.Strategies.Net5CompatFileStreamStrategy.WriteAsyncInternal().