MCPcopy Create free account
hub / github.com/WasmEdge/WasmEdge / fdPwrite

Method fdPwrite

lib/host/wasi/inode-win.cpp:984–1029  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

982}
983
984WasiExpect<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
1031WasiExpect<void> INode::fdRead(Span<Span<uint8_t>> IOVs,
1032 __wasi_size_t &NRead) const noexcept {

Callers 1

bodyMethod · 0.45

Calls 7

_ULARGE_INTEGERFunction · 0.85
unlikelyFunction · 0.85
WasiUnexpectFunction · 0.85
fromLastErrorFunction · 0.85
resizeMethod · 0.80
sizeMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected