예제 #1
0
        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);
                        }
                    }
                }
            }
        }
예제 #2
0
            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);
            }
예제 #3
0
 /// <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;
 }