From 8a1b302e48ee77c15d98382e1f24ce64206f6f0e Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Mon, 4 Sep 2023 15:55:27 +0100 Subject: [PATCH 1/2] Core - Further reduced allocations in process monitor checking --- .../ProcessActivationRequirement.cs | 11 +----- .../ProcessMonitoring/ProcessMonitor.cs | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs b/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs index b9b4329c0..aa553ba4a 100644 --- a/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs +++ b/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs @@ -38,16 +38,7 @@ public class ProcessActivationRequirement : IModuleActivationRequirement /// public bool Evaluate() { - if (!ProcessMonitor.IsStarted || (ProcessName == null && Location == null)) - return false; - - IEnumerable processes = ProcessMonitor.Processes; - if (ProcessName != null) - processes = processes.Where(p => string.Equals(p.ProcessName, ProcessName, StringComparison.InvariantCultureIgnoreCase)); - if (Location != null) - processes = processes.Where(p => string.Equals(Path.GetDirectoryName(p.Executable), Location, StringComparison.InvariantCultureIgnoreCase)); - - return processes.Any(); + return ProcessMonitor.IsProcessRunning(ProcessName, Location); } /// diff --git a/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs b/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs index ee265e90d..743e70416 100644 --- a/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs +++ b/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.IO; using System.Linq; +using System.Numerics; using System.Threading; namespace Artemis.Core.Services; @@ -99,6 +101,23 @@ public static partial class ProcessMonitor FreeBuffer(); } } + + /// + /// Returns whether the specified process is running + /// + /// The name of the process to check + /// The location of where the process must be running from (optional) + /// + public static bool IsProcessRunning(string? processName = null, string? processLocation = null) + { + if (!IsStarted || (processName == null && processLocation == null)) + return false; + + lock (LOCK) + { + return _processes.Values.Any(x => Match(x, processName, processLocation)); + } + } // ReSharper disable once SuggestBaseTypeForParameter private static void HandleStoppedProcesses(HashSet currentProcessIds) @@ -112,6 +131,21 @@ public static partial class ProcessMonitor OnProcessStopped(info); } } + + private static bool Match(ProcessInfo info, string? processName, string? processLocation) + { + if (processName != null && processLocation != null) + return string.Equals(info.ProcessName, processName, StringComparison.InvariantCultureIgnoreCase) && + string.Equals(Path.GetDirectoryName(info.Executable), processLocation, StringComparison.InvariantCultureIgnoreCase); + + if (processName != null) + return string.Equals(info.ProcessName, processName, StringComparison.InvariantCultureIgnoreCase); + + if (processLocation != null) + return string.Equals(Path.GetDirectoryName(info.Executable), processLocation, StringComparison.InvariantCultureIgnoreCase); + + return false; + } private static void OnProcessStarted(ProcessInfo processInfo) { From 625fff4b7364f4c0865ee07fdc51ad2f6d89395e Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Mon, 4 Sep 2023 15:56:59 +0100 Subject: [PATCH 2/2] Fix namespaces --- .../ActivationRequirements/ProcessActivationRequirement.cs | 3 --- .../Services/ProcessMonitoring/ProcessMonitor.cs | 5 ++--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs b/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs index aa553ba4a..422de2a5e 100644 --- a/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs +++ b/src/Artemis.Core/Plugins/Modules/ActivationRequirements/ProcessActivationRequirement.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; using Artemis.Core.Services; namespace Artemis.Core.Modules; diff --git a/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs b/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs index 743e70416..0ad901301 100644 --- a/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs +++ b/src/Artemis.Core/Services/ProcessMonitoring/ProcessMonitor.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.IO; using System.Linq; -using System.Numerics; using System.Threading; namespace Artemis.Core.Services; @@ -115,7 +114,7 @@ public static partial class ProcessMonitor lock (LOCK) { - return _processes.Values.Any(x => Match(x, processName, processLocation)); + return _processes.Values.Any(x => IsProcessRunning(x, processName, processLocation)); } } @@ -132,7 +131,7 @@ public static partial class ProcessMonitor } } - private static bool Match(ProcessInfo info, string? processName, string? processLocation) + private static bool IsProcessRunning(ProcessInfo info, string? processName, string? processLocation) { if (processName != null && processLocation != null) return string.Equals(info.ProcessName, processName, StringComparison.InvariantCultureIgnoreCase) &&