in Common/Common.cpp [261:487]
string Target::GetXml(UINT32 indent) const
{
char buffer[4096];
string sXml;
AddXmlInc(sXml, "<Target>\n");
AddXml(sXml, "<Path>" + _sPath + "</Path>\n");
sprintf_s(buffer, _countof(buffer), "<BlockSize>%u</BlockSize>\n", _dwBlockSize);
AddXml(sXml, buffer);
sprintf_s(buffer, _countof(buffer), "<BaseFileOffset>%I64u</BaseFileOffset>\n", _ullBaseFileOffset);
AddXml(sXml, buffer);
AddXml(sXml, _fSequentialScanHint ? "<SequentialScan>true</SequentialScan>\n" : "<SequentialScan>false</SequentialScan>\n");
AddXml(sXml, _fRandomAccessHint ? "<RandomAccess>true</RandomAccess>\n" : "<RandomAccess>false</RandomAccess>\n");
AddXml(sXml, _fTemporaryFileHint ? "<TemporaryFile>true</TemporaryFile>\n" : "<TemporaryFile>false</TemporaryFile>\n");
AddXml(sXml, _fUseLargePages ? "<UseLargePages>true</UseLargePages>\n" : "<UseLargePages>false</UseLargePages>\n");
// TargetCacheMode::Cached is implied default
switch (_cacheMode)
{
case TargetCacheMode::DisableLocalCache:
AddXml(sXml, "<DisableLocalCache>true</DisableLocalCache>\n");
break;
case TargetCacheMode::DisableOSCache:
AddXml(sXml, "<DisableOSCache>true</DisableOSCache>\n");
break;
}
// WriteThroughMode::Off is implied default
switch (_writeThroughMode)
{
case WriteThroughMode::On:
AddXml(sXml, "<WriteThrough>true</WriteThrough>\n");
break;
}
// MemoryMappedIoMode::Off is implied default
switch (_memoryMappedIoMode)
{
case MemoryMappedIoMode::On:
AddXml(sXml, "<MemoryMappedIo>true</MemoryMappedIo>\n");
break;
}
// MemoryMappedIoFlushMode::Undefined is implied default
switch (_memoryMappedIoFlushMode)
{
case MemoryMappedIoFlushMode::ViewOfFile:
AddXml(sXml, "<FlushType>ViewOfFile</FlushType>\n");
break;
case MemoryMappedIoFlushMode::NonVolatileMemory:
AddXml(sXml, "<FlushType>NonVolatileMemory</FlushType>\n")
break;
case MemoryMappedIoFlushMode::NonVolatileMemoryNoDrain:
AddXml(sXml, "<FlushType>NonVolatileMemoryNoDrain</FlushType>\n");
break;
}
AddXmlInc(sXml, "<WriteBufferContent>\n");
if (_fZeroWriteBuffers)
{
AddXml(sXml, "<Pattern>zero</Pattern>\n");
}
else if (_cbRandomDataWriteBuffer == 0)
{
AddXml(sXml, "<Pattern>sequential</Pattern>\n");
}
else
{
AddXml(sXml, "<Pattern>random</Pattern>\n");
AddXmlInc(sXml, "<RandomDataSource>\n");
sprintf_s(buffer, _countof(buffer), "<SizeInBytes>%I64u</SizeInBytes>\n", _cbRandomDataWriteBuffer);
AddXml(sXml, buffer);
if (_sRandomDataWriteBufferSourcePath != "")
{
AddXml(sXml, "<FilePath>" + _sRandomDataWriteBufferSourcePath + "</FilePath>\n");
}
AddXmlDec(sXml, "</RandomDataSource>\n");
}
AddXmlDec(sXml, "</WriteBufferContent>\n");
AddXml(sXml, _fParallelAsyncIO ? "<ParallelAsyncIO>true</ParallelAsyncIO>\n" : "<ParallelAsyncIO>false</ParallelAsyncIO>\n");
if (_fUseBurstSize)
{
sprintf_s(buffer, _countof(buffer), "<BurstSize>%u</BurstSize>\n", _dwBurstSize);
AddXml(sXml, buffer);
}
if (_fThinkTime)
{
sprintf_s(buffer, _countof(buffer), "<ThinkTime>%u</ThinkTime>\n", _dwThinkTime);
AddXml(sXml, buffer);
}
if (_fCreateFile)
{
sprintf_s(buffer, _countof(buffer), "<FileSize>%I64u</FileSize>\n", _ullFileSize);
AddXml(sXml, buffer);
}
// If XML contains <Random>, <StrideSize> is ignored
if (_ulRandomRatio > 0)
{
sprintf_s(buffer, _countof(buffer), "<Random>%I64u</Random>\n", GetBlockAlignmentInBytes());
AddXml(sXml, buffer);
// 100% random is <Random> alone
if (_ulRandomRatio != 100)
{
sprintf_s(buffer, _countof(buffer), "<RandomRatio>%u</RandomRatio>\n", GetRandomRatio());
AddXml(sXml, buffer);
}
// Distributions only occur in profiles with random IO.
if (_vDistributionRange.size())
{
char *type = nullptr;
switch (_distributionType)
{
case DistributionType::Absolute:
type = "Absolute";
break;
case DistributionType::Percent:
type = "Percent";
break;
default:
assert(false);
}
AddXmlInc(sXml, "<Distribution>\n");
AddXmlInc(sXml, "<");
sXml += type;
sXml += ">\n";
for (auto r : _vDistributionRange)
{
sprintf_s(buffer, _countof(buffer), "<Range IO=\"%u\">%I64u", r._span, r._dst.second);
AddXml(sXml, buffer);
sXml += "</Range>\n";
}
AddXmlDec(sXml, "</");
sXml += type;
sXml += ">\n";
AddXmlDec(sXml, "</Distribution>\n");
}
}
else
{
sprintf_s(buffer, _countof(buffer), "<StrideSize>%I64u</StrideSize>\n", GetBlockAlignmentInBytes());
AddXml(sXml, buffer);
AddXml(sXml, _fInterlockedSequential ?
"<InterlockedSequential>true</InterlockedSequential>\n" :
"<InterlockedSequential>false</InterlockedSequential>\n");
}
sprintf_s(buffer, _countof(buffer), "<ThreadStride>%I64u</ThreadStride>\n", _ullThreadStride);
AddXml(sXml, buffer);
sprintf_s(buffer, _countof(buffer), "<MaxFileSize>%I64u</MaxFileSize>\n", _ullMaxFileSize);
AddXml(sXml, buffer);
sprintf_s(buffer, _countof(buffer), "<RequestCount>%u</RequestCount>\n", _dwRequestCount);
AddXml(sXml, buffer);
sprintf_s(buffer, _countof(buffer), "<WriteRatio>%u</WriteRatio>\n", _ulWriteRatio);
AddXml(sXml, buffer);
// Preserve specified units
if (_dwThroughputIOPS)
{
sprintf_s(buffer, _countof(buffer), "<Throughput unit=\"IOPS\">%u</Throughput>\n", _dwThroughputIOPS);
AddXml(sXml, buffer);
}
else
{
sprintf_s(buffer, _countof(buffer), "<Throughput>%u</Throughput>\n", _dwThroughputBytesPerMillisecond);
AddXml(sXml, buffer);
}
sprintf_s(buffer, _countof(buffer), "<ThreadsPerFile>%u</ThreadsPerFile>\n", _dwThreadsPerFile);
AddXml(sXml, buffer);
if (_ioPriorityHint == IoPriorityHintVeryLow)
{
AddXml(sXml, "<IOPriority>1</IOPriority>\n");
}
else if (_ioPriorityHint == IoPriorityHintLow)
{
AddXml(sXml, "<IOPriority>2</IOPriority>\n");
}
else if (_ioPriorityHint == IoPriorityHintNormal)
{
AddXml(sXml, "<IOPriority>3</IOPriority>\n");
}
else
{
AddXml(sXml, "<IOPriority>* UNSUPPORTED *</IOPriority>\n");
}
sprintf_s(buffer, _countof(buffer), "<Weight>%u</Weight>\n", _ulWeight);
AddXml(sXml, buffer);
if (_vThreadTargets.size() > 0)
{
AddXmlInc(sXml, "<ThreadTargets>\n");
for (const auto& threadTarget : _vThreadTargets)
{
sXml += threadTarget.GetXml(indent);
}
AddXmlDec(sXml, "</ThreadTargets>\n");
}
AddXmlDec(sXml, "</Target>\n");
return sXml;
}