Merge pull request #6376 from nemerle/compiletime_filerequest_code2

Compile time reduction - FileRequest & related changes
This commit is contained in:
Chris Galvan
2022-01-24 11:43:27 -06:00
committed by GitHub
90 changed files with 913 additions and 641 deletions
@@ -172,9 +172,9 @@ namespace AZ::IO
AZ_PROFILE_FUNCTION(AzCore);
AZ_Assert(request, "PrepareRequest was provided a null request.");
if (AZStd::holds_alternative<FileRequest::ReadRequestData>(request->GetCommand()))
if (AZStd::holds_alternative<Requests::ReadRequestData>(request->GetCommand()))
{
auto& readRequest = AZStd::get<FileRequest::ReadRequestData>(request->GetCommand());
auto& readRequest = AZStd::get<Requests::ReadRequestData>(request->GetCommand());
if (IsServicedByThisDrive(readRequest.m_path.GetAbsolutePath()))
{
FileRequest* read = m_context->GetNewInternalRequest();
@@ -195,7 +195,7 @@ namespace AZ::IO
AZStd::visit([this, request](auto&& args)
{
using Command = AZStd::decay_t<decltype(args)>;
if constexpr (AZStd::is_same_v<Command, FileRequest::ReadData>)
if constexpr (AZStd::is_same_v<Command, Requests::ReadData>)
{
if (IsServicedByThisDrive(args.m_path.GetAbsolutePath()))
{
@@ -203,8 +203,8 @@ namespace AZ::IO
return;
}
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::FileExistsCheckData> ||
AZStd::is_same_v<Command, FileRequest::FileMetaDataRetrievalData>)
else if constexpr (AZStd::is_same_v<Command, Requests::FileExistsCheckData> ||
AZStd::is_same_v<Command, Requests::FileMetaDataRetrievalData>)
{
if (IsServicedByThisDrive(args.m_path.GetAbsolutePath()))
{
@@ -212,7 +212,7 @@ namespace AZ::IO
return;
}
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::CancelData>)
else if constexpr (AZStd::is_same_v<Command, Requests::CancelData>)
{
if (CancelRequest(request, args.m_target))
{
@@ -221,15 +221,15 @@ namespace AZ::IO
return;
}
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::FlushData>)
else if constexpr (AZStd::is_same_v<Command, Requests::FlushData>)
{
FlushCache(args.m_path);
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::FlushAllData>)
else if constexpr (AZStd::is_same_v<Command, Requests::FlushAllData>)
{
FlushEntireCache();
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::ReportData>)
else if constexpr (AZStd::is_same_v<Command, Requests::ReportData>)
{
Report(args);
}
@@ -254,27 +254,29 @@ namespace AZ::IO
else if (!m_pendingRequests.empty())
{
FileRequest* request = m_pendingRequests.front();
hasWorked = AZStd::visit([this, request](auto&& args)
{
using Command = AZStd::decay_t<decltype(args)>;
if constexpr (AZStd::is_same_v<Command, FileRequest::FileExistsCheckData>)
hasWorked = AZStd::visit(
[this, request](auto&& args)
{
FileExistsRequest(request);
m_pendingRequests.pop_front();
return true;
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::FileMetaDataRetrievalData>)
{
FileMetaDataRetrievalRequest(request);
m_pendingRequests.pop_front();
return true;
}
else
{
AZ_Assert(false, "A request was added to StorageDriveWin's pending queue that isn't supported.");
return false;
}
}, request->GetCommand());
using Command = AZStd::decay_t<decltype(args)>;
if constexpr (AZStd::is_same_v<Command, Requests::FileExistsCheckData>)
{
FileExistsRequest(request);
m_pendingRequests.pop_front();
return true;
}
else if constexpr (AZStd::is_same_v<Command, Requests::FileMetaDataRetrievalData>)
{
FileMetaDataRetrievalRequest(request);
m_pendingRequests.pop_front();
return true;
}
else
{
AZ_Assert(false, "A request was added to StorageDriveWin's pending queue that isn't supported.");
return false;
}
},
request->GetCommand());
}
return StreamStackEntry::ExecuteRequests() || hasFinalizedReads || hasWorked;
@@ -308,7 +310,7 @@ namespace AZ::IO
FileReadInformation& read = m_readSlots_readInfo[i];
u64 totalBytesRead = m_readSizeAverage.GetTotal();
double totalReadTimeUSec = aznumeric_caster(m_readTimeAverage.GetTotal().count());
auto readCommand = AZStd::get_if<FileRequest::ReadData>(&read.m_request->GetCommand());
auto readCommand = AZStd::get_if<Requests::ReadData>(&read.m_request->GetCommand());
AZ_Assert(readCommand, "Request currently reading doesn't contain a read command.");
auto endTime = read.m_startTime + AZStd::chrono::microseconds(aznumeric_cast<u64>((readCommand->m_size * totalReadTimeUSec) / totalBytesRead));
earliestSlot = AZStd::min(earliestSlot, endTime);
@@ -354,25 +356,25 @@ namespace AZ::IO
AZStd::visit([&](auto&& args)
{
using Command = AZStd::decay_t<decltype(args)>;
if constexpr (AZStd::is_same_v<Command, FileRequest::ReadData>)
if constexpr (AZStd::is_same_v<Command, Requests::ReadData>)
{
targetFile = &args.m_path;
readSize = args.m_size;
offset = args.m_offset;
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::CompressedReadData>)
else if constexpr (AZStd::is_same_v<Command, Requests::CompressedReadData>)
{
targetFile = &args.m_compressionInfo.m_archiveFilename;
readSize = args.m_compressionInfo.m_compressedSize;
offset = args.m_compressionInfo.m_offset;
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::FileExistsCheckData>)
else if constexpr (AZStd::is_same_v<Command, Requests::FileExistsCheckData>)
{
readSize = 0;
AZStd::chrono::microseconds getFileExistsTimeAverage = m_getFileExistsTimeAverage.CalculateAverage();
startTime += getFileExistsTimeAverage;
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::FileMetaDataRetrievalData>)
else if constexpr (AZStd::is_same_v<Command, Requests::FileMetaDataRetrievalData>)
{
readSize = 0;
AZStd::chrono::microseconds getFileExistsTimeAverage = m_getFileMetaDataRetrievalTimeAverage.CalculateAverage();
@@ -411,15 +413,15 @@ namespace AZ::IO
AZStd::visit([&, this](auto&& args)
{
using Command = AZStd::decay_t<decltype(args)>;
if constexpr (AZStd::is_same_v<Command, FileRequest::ReadData> ||
AZStd::is_same_v<Command, FileRequest::FileExistsCheckData>)
if constexpr (AZStd::is_same_v<Command, Requests::ReadData> ||
AZStd::is_same_v<Command, Requests::FileExistsCheckData>)
{
if (IsServicedByThisDrive(args.m_path.GetAbsolutePath()))
{
EstimateCompletionTimeForRequest(request, startTime, activeFile, activeOffset);
}
}
else if constexpr (AZStd::is_same_v<Command, FileRequest::CompressedReadData>)
else if constexpr (AZStd::is_same_v<Command, Requests::CompressedReadData>)
{
if (IsServicedByThisDrive(args.m_compressionInfo.m_archiveFilename.GetAbsolutePath()))
{
@@ -435,7 +437,7 @@ namespace AZ::IO
aznumeric_cast<s32>(m_pendingRequests.size()) - m_activeReads_Count;
}
auto StorageDriveWin::OpenFile(HANDLE& fileHandle, size_t& cacheSlot, FileRequest* request, const FileRequest::ReadData& data) -> OpenFileResult
auto StorageDriveWin::OpenFile(HANDLE& fileHandle, size_t& cacheSlot, FileRequest* request, const Requests::ReadData& data) -> OpenFileResult
{
HANDLE file = INVALID_HANDLE_VALUE;
@@ -553,7 +555,7 @@ namespace AZ::IO
return false;
}
auto data = AZStd::get_if<FileRequest::ReadData>(&request->GetCommand());
auto data = AZStd::get_if<Requests::ReadData>(&request->GetCommand());
AZ_Assert(data, "Read request in StorageDriveWin doesn't contain read data.");
HANDLE file = INVALID_HANDLE_VALUE;
@@ -780,7 +782,7 @@ namespace AZ::IO
void StorageDriveWin::FileExistsRequest(FileRequest* request)
{
auto& fileExists = AZStd::get<FileRequest::FileExistsCheckData>(request->GetCommand());
auto& fileExists = AZStd::get<Requests::FileExistsCheckData>(request->GetCommand());
AZ_PROFILE_SCOPE(AzCore, "StorageDriveWin::FileExistsRequest %s : %s",
m_name.c_str(), fileExists.m_path.GetRelativePath());
@@ -836,7 +838,7 @@ namespace AZ::IO
void StorageDriveWin::FileMetaDataRetrievalRequest(FileRequest* request)
{
auto& command = AZStd::get<FileRequest::FileMetaDataRetrievalData>(request->GetCommand());
auto& command = AZStd::get<Requests::FileMetaDataRetrievalData>(request->GetCommand());
AZ_PROFILE_SCOPE(AzCore, "StorageDriveWin::FileMetaDataRetrievalRequest %s : %s",
m_name.c_str(), command.m_path.GetRelativePath());
@@ -1005,7 +1007,7 @@ namespace AZ::IO
FileReadInformation& fileReadInfo = m_readSlots_readInfo[readSlot];
auto readCommand = AZStd::get_if<FileRequest::ReadData>(&fileReadInfo.m_request->GetCommand());
auto readCommand = AZStd::get_if<Requests::ReadData>(&fileReadInfo.m_request->GetCommand());
AZ_Assert(readCommand != nullptr, "Request stored with the overlapped I/O call did not contain a read request.");
if (fileReadInfo.m_sectorAlignedOutput && !encounteredError)
@@ -1147,11 +1149,11 @@ namespace AZ::IO
StreamStackEntry::CollectStatistics(statistics);
}
void StorageDriveWin::Report(const FileRequest::ReportData& data) const
void StorageDriveWin::Report(const Requests::ReportData& data) const
{
switch (data.m_reportType)
{
case FileRequest::ReportData::ReportType::FileLocks:
case Requests::ReportType::FileLocks:
if (m_cachesInitialized)
{
for (u32 i = 0; i < m_maxFileHandles; ++i)
@@ -9,6 +9,7 @@
#pragma once
#include <AzCore/PlatformIncl.h>
#include <AzCore/IO/Streamer/RequestPath.h>
#include <AzCore/IO/Streamer/Statistics.h>
#include <AzCore/IO/Streamer/StreamerConfiguration.h>
#include <AzCore/IO/Streamer/StreamStackEntry.h>
@@ -19,6 +20,12 @@
#include <AzCore/std/string/string_view.h>
#include <AzCore/Statistics/RunningStatistic.h>
namespace AZ::IO::Requests
{
struct ReadData;
struct ReportData;
}
namespace AZ::IO
{
class StorageDriveWin
@@ -111,7 +118,7 @@ namespace AZ::IO
CacheFull
};
OpenFileResult OpenFile(HANDLE& fileHandle, size_t& cacheSlot, FileRequest* request, const FileRequest::ReadData& data);
OpenFileResult OpenFile(HANDLE& fileHandle, size_t& cacheSlot, FileRequest* request, const Requests::ReadData& data);
bool ReadRequest(FileRequest* request);
bool ReadRequest(FileRequest* request, size_t readSlot);
bool CancelRequest(FileRequest* cancelRequest, FileRequestPtr& target);
@@ -137,7 +144,7 @@ namespace AZ::IO
void FinalizeSingleRequest(FileReadStatus& status, size_t readSlot, DWORD numBytesTransferred,
bool isCanceled, bool encounteredError);
void Report(const FileRequest::ReportData& data) const;
void Report(const Requests::ReportData& data) const;
TimedAverageWindow<s_statisticsWindowSize> m_fileOpenCloseTimeAverage;
TimedAverageWindow<s_statisticsWindowSize> m_getFileExistsTimeAverage;