/// <summary>Parses string of process info lines into ProcessInfo objects</summary> /// <param name="processesInfoStr"/> /// <returns>Map of pid string to ProcessInfo objects</returns> internal virtual IDictionary <string, WindowsBasedProcessTree.ProcessInfo> CreateProcessInfo (string processesInfoStr) { string[] processesStr = processesInfoStr.Split("\r\n"); IDictionary <string, WindowsBasedProcessTree.ProcessInfo> allProcs = new Dictionary <string, WindowsBasedProcessTree.ProcessInfo>(); int procInfoSplitCount = 4; foreach (string processStr in processesStr) { if (processStr != null) { string[] procInfo = processStr.Split(","); if (procInfo.Length == procInfoSplitCount) { try { WindowsBasedProcessTree.ProcessInfo pInfo = new WindowsBasedProcessTree.ProcessInfo (); pInfo.pid = procInfo[0]; pInfo.vmem = long.Parse(procInfo[1]); pInfo.workingSet = long.Parse(procInfo[2]); pInfo.cpuTimeMs = long.Parse(procInfo[3]); allProcs[pInfo.pid] = pInfo; } catch (FormatException nfe) { Log.Debug("Error parsing procInfo." + nfe); } } else { Log.Debug("Expected split length of proc info to be " + procInfoSplitCount + ". Got " + procInfo.Length); } } } return(allProcs); }
public override void UpdateProcessTree() { if (taskProcessId != null) { // taskProcessId can be null in some tests string processesInfoStr = GetAllProcessInfoFromShell(); if (processesInfoStr != null && processesInfoStr.Length > 0) { IDictionary <string, WindowsBasedProcessTree.ProcessInfo> allProcessInfo = CreateProcessInfo (processesInfoStr); foreach (KeyValuePair <string, WindowsBasedProcessTree.ProcessInfo> entry in allProcessInfo) { string pid = entry.Key; WindowsBasedProcessTree.ProcessInfo pInfo = entry.Value; WindowsBasedProcessTree.ProcessInfo oldInfo = processTree[pid]; if (oldInfo != null) { // existing process, update age and replace value pInfo.age += oldInfo.age; // calculate the delta since the last refresh. totals are being kept // in the WindowsBasedProcessTree object pInfo.cpuTimeMsDelta = pInfo.cpuTimeMs - oldInfo.cpuTimeMs; } else { // new process. delta cpu == total cpu pInfo.cpuTimeMsDelta = pInfo.cpuTimeMs; } } processTree.Clear(); processTree = allProcessInfo; } else { // clearing process tree to mimic semantics of existing Procfs impl processTree.Clear(); } } }