diff options
| -rw-r--r-- | zencore/filesystem.cpp | 12 | ||||
| -rw-r--r-- | zenserver/cache/structuredcache.cpp | 20 |
2 files changed, 22 insertions, 10 deletions
diff --git a/zencore/filesystem.cpp b/zencore/filesystem.cpp index 1e4a52638..a2442a134 100644 --- a/zencore/filesystem.cpp +++ b/zencore/filesystem.cpp @@ -976,19 +976,27 @@ PathFromHandle(void* NativeHandle) } }; - DWORD RequiredLengthIncludingNul = GetFinalPathNameByHandleWRetry(NativeHandle, nullptr, 0, FILE_NAME_OPENED); + static const DWORD PathDataSize = 512; + wchar_t PathData[PathDataSize]; + DWORD RequiredLengthIncludingNul = GetFinalPathNameByHandleWRetry(NativeHandle, PathData, PathDataSize, FILE_NAME_OPENED); if (RequiredLengthIncludingNul == 0) { ThrowLastError(fmt::format("failed to get path from file handle {}", NativeHandle)); } + if (RequiredLengthIncludingNul < PathDataSize) + { + std::wstring FullPath(PathData, gsl::narrow<size_t>(RequiredLengthIncludingNul)); + return FullPath; + } + std::wstring FullPath; FullPath.resize(RequiredLengthIncludingNul - 1); const DWORD FinalLength = GetFinalPathNameByHandleWRetry(NativeHandle, FullPath.data(), RequiredLengthIncludingNul, FILE_NAME_OPENED); ZEN_UNUSED(FinalLength); - return FullPath; + #elif ZEN_PLATFORM_LINUX char Link[PATH_MAX]; char Path[64]; diff --git a/zenserver/cache/structuredcache.cpp b/zenserver/cache/structuredcache.cpp index f649efa01..a7571b4c4 100644 --- a/zenserver/cache/structuredcache.cpp +++ b/zenserver/cache/structuredcache.cpp @@ -149,14 +149,15 @@ namespace cache::detail { } } uint32_t BlockCount = gsl::narrow<uint32_t>(MaxChunkPosition / RecordedRequestBlockSize) + 1; - m_IoBuffers.resize(BlockCount); + m_BlockFiles.resize(BlockCount); for (uint32_t BlockIndex = 0; BlockIndex < BlockCount; ++BlockIndex) { - m_IoBuffers[BlockIndex] = IoBufferBuilder::MakeFromFile(m_BasePath / fmt::format("chunks{}.bin", BlockIndex)); + m_BlockFiles[BlockIndex] = std::make_unique<BasicFile>(); + m_BlockFiles[BlockIndex]->Open(m_BasePath / fmt::format("chunks{}.bin", BlockIndex), BasicFile::Mode::kRead); } return m_Entries.size(); } - void EndRead() { m_IoBuffers.clear(); } + void EndRead() { m_BlockFiles.clear(); } ZenContentType ReadRequest(uint64_t RequestIndex, IoBuffer& OutBuffer) const { @@ -171,19 +172,22 @@ namespace cache::detail { } if (Entry.Offset != ~0ull) { - uint32_t BlockIndex = gsl::narrow<uint32_t>((Entry.Offset + Entry.Length) / RecordedRequestBlockSize); - uint64_t ChunkOffset = Entry.Offset - (BlockIndex * RecordedRequestBlockSize); - OutBuffer = IoBuffer(m_IoBuffers[BlockIndex], ChunkOffset, Entry.Length); + uint32_t BlockIndex = gsl::narrow<uint32_t>((Entry.Offset + Entry.Length) / RecordedRequestBlockSize); + uint64_t ChunkOffset = Entry.Offset - (BlockIndex * RecordedRequestBlockSize); + OutBuffer = IoBuffer(Entry.Length); + MutableMemoryView OutView = OutBuffer.GetMutableView(); + m_BlockFiles[BlockIndex]->Read(OutView.GetData(), OutView.GetSize(), ChunkOffset); return Entry.ContentType; } - OutBuffer = IoBufferBuilder::MakeFromFile(m_BasePath / fmt::format("request{}.bin", RequestIndex)); + BasicFile ChunkFile; + ChunkFile.Open(m_BasePath / fmt::format("request{}.bin", RequestIndex), BasicFile::Mode::kRead); + OutBuffer = ChunkFile.ReadAll(); return Entry.ContentType; } std::filesystem::path m_BasePath; std::vector<RecordedRequest> m_Entries; std::vector<std::unique_ptr<BasicFile>> m_BlockFiles; - std::vector<IoBuffer> m_IoBuffers; }; class DiskRequestRecorder : public IRequestRecorder |