Skip to content

Commit

Permalink
Use EnumerateLines in TryParseStatusFile (#55266)
Browse files Browse the repository at this point in the history
  • Loading branch information
stephentoub authored Jul 8, 2021
1 parent cbf4020 commit 45b384d
Showing 1 changed file with 21 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,88 +55,57 @@ internal static bool TryParseStatusFile(string statusFilePath, out ParsedStatus
}

ParsedStatus results = default(ParsedStatus);
ReadOnlySpan<char> statusFileContents = fileContents.AsSpan();
int unitSliceLength = -1;
#if DEBUG
int nonUnitSliceLength = -1;
#endif
while (!statusFileContents.IsEmpty)
foreach (ReadOnlySpan<char> line in fileContents.AsSpan().EnumerateLines())
{
int startIndex = statusFileContents.IndexOf(':');
int startIndex = line.IndexOf(':');
if (startIndex == -1)
{
// Reached end of file
break;
}

ReadOnlySpan<char> title = statusFileContents.Slice(0, startIndex);
statusFileContents = statusFileContents.Slice(startIndex + 1);
int endIndex = statusFileContents.IndexOf('\n');
if (endIndex == -1)
{
endIndex = statusFileContents.Length - 1;
unitSliceLength = statusFileContents.Length - 3;
#if DEBUG
nonUnitSliceLength = statusFileContents.Length;
#endif
}
else
{
unitSliceLength = endIndex - 3;
#if DEBUG
nonUnitSliceLength = endIndex;
#endif
}

ReadOnlySpan<char> value = default;
ReadOnlySpan<char> name = line.Slice(0, startIndex);
ReadOnlySpan<char> value = line.Slice(startIndex + 1);
bool valueParsed = true;

#if DEBUG
if (title.SequenceEqual("Pid".AsSpan()))
if (name.SequenceEqual("Pid"))
{
value = statusFileContents.Slice(0, nonUnitSliceLength);
valueParsed = int.TryParse(value, out results.Pid);
}
else
#endif
if (title.SequenceEqual("VmHWM".AsSpan()))
if (name.SequenceEqual("VmHWM"))
{
value = statusFileContents.Slice(0, unitSliceLength);
valueParsed = ulong.TryParse(value, out results.VmHWM);
valueParsed = ulong.TryParse(value[..^3], out results.VmHWM);
}
else if (title.SequenceEqual("VmRSS".AsSpan()))
else if (name.SequenceEqual("VmRSS"))
{
value = statusFileContents.Slice(0, unitSliceLength);
valueParsed = ulong.TryParse(value, out results.VmRSS);
valueParsed = ulong.TryParse(value[..^3], out results.VmRSS);
}
else if (title.SequenceEqual("VmData".AsSpan()))
else if (name.SequenceEqual("VmData"))
{
value = statusFileContents.Slice(0, unitSliceLength);
valueParsed = ulong.TryParse(value, out ulong vmData);
valueParsed = ulong.TryParse(value[..^3], out ulong vmData);
results.VmData += vmData;
}
else if (title.SequenceEqual("VmSwap".AsSpan()))
else if (name.SequenceEqual("VmSwap"))
{
value = statusFileContents.Slice(0, unitSliceLength);
valueParsed = ulong.TryParse(value, out results.VmSwap);
valueParsed = ulong.TryParse(value[..^3], out results.VmSwap);
}
else if (title.SequenceEqual("VmSize".AsSpan()))
else if (name.SequenceEqual("VmSize"))
{
value = statusFileContents.Slice(0, unitSliceLength);
valueParsed = ulong.TryParse(value, out results.VmSize);
valueParsed = ulong.TryParse(value[..^3], out results.VmSize);
}
else if (title.SequenceEqual("VmPeak".AsSpan()))
else if (name.SequenceEqual("VmPeak"))
{
value = statusFileContents.Slice(0, unitSliceLength);
valueParsed = ulong.TryParse(value, out results.VmPeak);
valueParsed = ulong.TryParse(value[..^3], out results.VmPeak);
}
else if (title.SequenceEqual("VmStk".AsSpan()))
else if (name.SequenceEqual("VmStk"))
{
value = statusFileContents.Slice(0, unitSliceLength);
valueParsed = ulong.TryParse(value, out ulong vmStack);
valueParsed = ulong.TryParse(value[..^3], out ulong vmStack);
results.VmData += vmStack;
}

Debug.Assert(valueParsed);
statusFileContents = statusFileContents.Slice(endIndex + 1);
}

results.VmData *= 1024;
Expand Down

0 comments on commit 45b384d

Please sign in to comment.