in IORequestGenerator/IORequestGenerator.cpp [2618:2695]
vector<struct IORequestGenerator::CreateFileParameters> IORequestGenerator::_GetFilesToPrecreate(const Profile& profile) const
{
vector<struct CreateFileParameters> vFilesToCreate;
const vector<TimeSpan>& vTimeSpans = profile.GetTimeSpans();
map<string, vector<struct CreateFileParameters>> filesMap;
for (const auto& timeSpan : vTimeSpans)
{
vector<Target> vTargets(timeSpan.GetTargets());
for (const auto& target : vTargets)
{
struct CreateFileParameters createFileParameters;
createFileParameters.sPath = target.GetPath();
createFileParameters.ullFileSize = target.GetFileSize();
createFileParameters.fZeroWriteBuffers = target.GetZeroWriteBuffers();
filesMap[createFileParameters.sPath].push_back(createFileParameters);
}
}
PrecreateFiles filter = profile.GetPrecreateFiles();
for (auto fileMapEntry : filesMap)
{
if (fileMapEntry.second.size() > 0)
{
UINT64 ullLastNonZeroSize = fileMapEntry.second[0].ullFileSize;
UINT64 ullMaxSize = fileMapEntry.second[0].ullFileSize;
bool fLastZeroWriteBuffers = fileMapEntry.second[0].fZeroWriteBuffers;
bool fHasZeroSizes = false;
bool fConstantSize = true;
bool fConstantZeroWriteBuffers = true;
for (auto file : fileMapEntry.second)
{
ullMaxSize = max(ullMaxSize, file.ullFileSize);
if (ullLastNonZeroSize == 0)
{
ullLastNonZeroSize = file.ullFileSize;
}
if (file.ullFileSize == 0)
{
fHasZeroSizes = true;
}
if ((file.ullFileSize != 0) && (file.ullFileSize != ullLastNonZeroSize))
{
fConstantSize = false;
}
if (file.fZeroWriteBuffers != fLastZeroWriteBuffers)
{
fConstantZeroWriteBuffers = false;
}
if (file.ullFileSize != 0)
{
ullLastNonZeroSize = file.ullFileSize;
}
fLastZeroWriteBuffers = file.fZeroWriteBuffers;
}
if (fConstantZeroWriteBuffers && ullMaxSize > 0)
{
struct CreateFileParameters file = fileMapEntry.second[0];
file.ullFileSize = ullMaxSize;
if (filter == PrecreateFiles::UseMaxSize)
{
vFilesToCreate.push_back(file);
}
else if ((filter == PrecreateFiles::OnlyFilesWithConstantSizes) && fConstantSize && !fHasZeroSizes)
{
vFilesToCreate.push_back(file);
}
else if ((filter == PrecreateFiles::OnlyFilesWithConstantOrZeroSizes) && fConstantSize)
{
vFilesToCreate.push_back(file);
}
}
}
}
return vFilesToCreate;
}