public void ProcessMemRecord(ETWLineReader l, ByteWindow b, MemEffect memeffect) { // empty the net effect of this record memeffect.released = memeffect.reserved = memeffect.committed = memeffect.decommitted = 0; int interval = (int)((l.t - l.t0) / (double)(l.t1 - l.t0) * memoryPlotColumns); // the above can overflow because time ranges might be out of order so clamp any overflows // also we have to handle the case where l.t == l.t1 which would otherwise overflow if (interval < 0) { interval = 0; } if (interval >= memoryPlotColumns) { interval = memoryPlotColumns - 1; } bT.Assign(b, fldProcessNamePID).Trim(); int idProcess = trace.atomsProcesses.Lookup(bT); // bogus process, disregard if (idProcess == -1) { return; } MemInfo p = memInfos[idProcess]; var rsReserved = p.rsReserved; var rsCommitted = p.rsCommitted; ulong addrBase = b.GetHex(fldMemBaseAddr); ulong addrEnd = b.GetHex(fldMemEndAddr); b.Field(fldFlags).Trim(); if (l.idType == idAlloc) { if (b.StartsWith(byReserveCommit)) { memeffect.reserved = rsReserved.AddRange(addrBase, addrEnd); p.cbReserved += memeffect.reserved; p.reservedDistribution[interval] += (long)memeffect.reserved; if (memeffect.reserved != 0) { p.cReserved++; } memeffect.committed = rsCommitted.AddRange(addrBase, addrEnd); p.cbCommitted += memeffect.committed; p.committedDistribution[interval] += (long)memeffect.committed; if (memeffect.committed != 0) { p.cCommitted++; } } else if (b.StartsWith(byReserve)) { memeffect.reserved = rsReserved.AddRange(addrBase, addrEnd); p.cbReserved += memeffect.reserved; p.reservedDistribution[interval] += (long)memeffect.reserved; if (memeffect.reserved != 0) { p.cReserved++; } } else if (b.StartsWith(byCommit)) { memeffect.committed = rsCommitted.AddRange(addrBase, addrEnd); p.cbCommitted += memeffect.committed; p.committedDistribution[interval] += (long)memeffect.committed; if (memeffect.committed != 0) { p.cCommitted++; } } } if (l.idType == idFree) { if (b.StartsWith(byRelease)) { memeffect.decommitted = rsCommitted.RemoveRange(addrBase, addrEnd); p.cbDecommitted += memeffect.decommitted; p.committedDistribution[interval] -= (long)memeffect.decommitted; if (memeffect.decommitted != 0) { p.cDecommitted++; } memeffect.released = rsReserved.RemoveRange(addrBase, addrEnd); p.cbReleased += memeffect.released; p.reservedDistribution[interval] -= (long)memeffect.released; if (memeffect.released != 0) { p.cReleased++; } } else if (b.StartsWith(byDecommit)) { memeffect.decommitted = rsCommitted.RemoveRange(addrBase, addrEnd); p.cbDecommitted += memeffect.decommitted; p.committedDistribution[interval] -= (long)memeffect.decommitted; if (memeffect.decommitted != 0) { p.cDecommitted++; } } } }