| 982 | } |
| 983 | |
| 984 | WasiExpect<void> INode::fdPwrite(Span<Span<const uint8_t>> IOVs, |
| 985 | __wasi_filesize_t Offset, |
| 986 | __wasi_size_t &NWritten) const noexcept { |
| 987 | WasiExpect<void> Result; |
| 988 | std::vector<OVERLAPPED_> Queries(IOVs.size()); |
| 989 | ULARGE_INTEGER_ LocalOffset = _ULARGE_INTEGER(Offset); |
| 990 | |
| 991 | for (size_t I = 0; I < IOVs.size(); ++I) { |
| 992 | auto &IOV = IOVs[I]; |
| 993 | auto &Query = Queries[I]; |
| 994 | Query.Offset = LocalOffset.LowPart; |
| 995 | Query.OffsetHigh = LocalOffset.HighPart; |
| 996 | Query.hEvent = nullptr; |
| 997 | if (!WriteFile(Handle, IOV.data(), static_cast<uint32_t>(IOV.size()), |
| 998 | nullptr, &Query)) { |
| 999 | if (const auto Error = GetLastError(); |
| 1000 | unlikely(Error != ERROR_IO_PENDING_ && Error != ERROR_HANDLE_EOF_)) { |
| 1001 | Result = WasiUnexpect(detail::fromLastError(Error)); |
| 1002 | Queries.resize(I); |
| 1003 | break; |
| 1004 | } |
| 1005 | } |
| 1006 | LocalOffset.QuadPart += IOV.size(); |
| 1007 | } |
| 1008 | |
| 1009 | NWritten = 0; |
| 1010 | for (size_t I = 0; I < Queries.size(); ++I) { |
| 1011 | auto &Query = Queries[I]; |
| 1012 | DWORD_ NumberOfBytesWrite = 0; |
| 1013 | if (unlikely( |
| 1014 | !GetOverlappedResult(Handle, &Query, &NumberOfBytesWrite, true))) { |
| 1015 | if (const auto Error = GetLastError(); |
| 1016 | unlikely(Error != ERROR_HANDLE_EOF_)) { |
| 1017 | Result = WasiUnexpect(detail::fromLastError(Error)); |
| 1018 | CancelIo(Handle); |
| 1019 | for (size_t J = I + 1; J < Queries.size(); ++J) { |
| 1020 | GetOverlappedResult(Handle, &Queries[J], &NumberOfBytesWrite, true); |
| 1021 | } |
| 1022 | break; |
| 1023 | } |
| 1024 | } |
| 1025 | NWritten += NumberOfBytesWrite; |
| 1026 | } |
| 1027 | |
| 1028 | return Result; |
| 1029 | } |
| 1030 | |
| 1031 | WasiExpect<void> INode::fdRead(Span<Span<uint8_t>> IOVs, |
| 1032 | __wasi_size_t &NRead) const noexcept { |
no test coverage detected