internal void Update() { // Clear out any processes which have ended. _trackedProcesses = _trackedProcesses.Where(tp => !tp.HasExited).ToList(); // CAUTION: This code is subject to a race condition where between one // call to update and the next, all the processes in the list ended, but new // processes (which we are not yet tracking) were created. In that case, // _trackedProcesses would now be empty, and the ProcessWatchdog would exit, // even though there are still processes we care about. // // This should not happen for the scenarios we care about, since the parent // process should outlive all its descendants. if (_trackedProcesses.Any()) { // Add any new descendants of the remaining processes (that is, any // descendants that we're not already tracking). UniqueProcess[] existingProcesses = _trackedProcesses.Select(tp => tp.Process).ToArray(); foreach (Process descendant in GetDescendants(_parentProcess.Id)) { UniqueProcess uniqueDescendant; if (UniqueProcess.TryCreate(descendant, out uniqueDescendant)) { if (!existingProcesses.Contains(uniqueDescendant)) { TrackProcess(descendant); } } } } }
internal static bool TryCreate( Process process, Process procDumpProcess, string description, out TrackedProcess trackedProcess) { bool result = false; trackedProcess = null; if (UniqueProcess.TryCreate(process, out var uniqueProcess) && UniqueProcess.TryCreate(procDumpProcess, out var uniqueProcDumpProcess)) { trackedProcess = new TrackedProcess(uniqueProcess, uniqueProcDumpProcess, description); result = true; } return(result); }
/// <summary> /// Initializes a new instance of the <see cref="TrackedProcess"/> class from /// the specified process information. /// </summary> /// <param name="process"> /// The process being tracked. /// </param> /// <param name="procDumpProcess"> /// The procdump process attached to <paramref name="process"/>, and responsible /// for producing a memory dump if that process should fail. /// </param> /// <param name="description"> /// A string that describes the process, of the form "processName-processId". /// </param> private TrackedProcess(UniqueProcess process, UniqueProcess procDumpProcess, string description) { Process = process; ProcDumpProcess = procDumpProcess; Description = description; }