public static bool ProcessesContainsOnlySelf(this ILockingProcessManager processManager) { if (processManager is null) { throw new ArgumentNullException(nameof(processManager)); } return(processManager.GetProcesses().Count() <= 1 && processManager.ProcessesContainsSelf()); }
public static bool ProcessesContainsSelf(this ILockingProcessManager processManager) { if (processManager is null) { throw new ArgumentNullException(nameof(processManager)); } var currentProcess = Process.GetCurrentProcess(); return(processManager.GetProcesses().Any(x => x.Id.Equals(currentProcess.Id))); }
private static bool ShowKillDialogCore(ILockingProcessManager processManager, bool retry, bool showSelf, CancellationToken token) { var currentProcessId = Process.GetCurrentProcess().Id; LockedFilesDialog.ProcessKillResult result; do { token.ThrowIfCancellationRequested(); var processes = processManager.GetProcesses().Where(x => x.ApplicationStatus == ApplicationStatus.Running).ToList(); if (!showSelf) { processes = processes.Where(x => x.Id != currentProcessId).ToList(); } if (!processes.Any()) { return(true); } var dialog = new LockedFilesDialog(processes, retry); dialog.ShowDialog(); result = dialog.Result; } while (result == LockedFilesDialog.ProcessKillResult.Retry); return(result == LockedFilesDialog.ProcessKillResult.Kill); }
internal static bool ShowSelfKillDialog(ILockingProcessManager processManager, CancellationToken token) { return(ShowKillDialogCore(processManager, false, true, token)); }
protected override async Task <PendingHandledResult> HandleLockedComponentsCoreAsync( ICollection <IComponent> pendingComponents, ILockingProcessManager lockingProcessManager, bool ignoreSelfLocked, CancellationToken token) { token.ThrowIfCancellationRequested(); if (!pendingComponents.Any()) { return(new PendingHandledResult(HandlePendingComponentsStatus.Handled)); } Logger.Trace("Hanlde restart request due to locked files"); var processes = lockingProcessManager.GetProcesses().ToList(); var isSelfLocking = lockingProcessManager.ProcessesContainsSelf(); if (!isSelfLocking && processes.Any(x => x.ApplicationType == TaskBasedUpdater.Restart.ApplicationType.Critical)) { return(new PendingHandledResult(HandlePendingComponentsStatus.Declined, "Files are locked by a system process that cannot be terminated. Please restart the system")); } using var lockingProcessManagerWithoutSelf = CreateFromProcessesWithoutSelf(processes); if (!isSelfLocking || ignoreSelfLocked) { var restartRequestResult = LauncherRestartManager.ShowProcessKillDialog(lockingProcessManagerWithoutSelf, token); Logger.Trace($"Kill locking processes: {restartRequestResult}, Launcher needs restart: {false}"); if (!restartRequestResult) { return(new PendingHandledResult(HandlePendingComponentsStatus.Declined, "Update aborted because locked files have not been released.")); } lockingProcessManagerWithoutSelf.Shutdown(); LockedFilesWatcher.Instance.LockedFiles.Clear(); await UpdateAsync(pendingComponents, token).ConfigureAwait(false); return(LockedFilesWatcher.Instance.LockedFiles.Any() ? new PendingHandledResult(HandlePendingComponentsStatus.HandledButStillPending, "Update failed because there are still locked files which have not been released.") : new PendingHandledResult(HandlePendingComponentsStatus.Handled)); } if (!UpdateConfiguration.Instance.SupportsRestart) { return(new PendingHandledResult(HandlePendingComponentsStatus.Declined, "Update requires a self-update which is not supported for this update configuration.")); } var result = LauncherRestartManager.ShowSelfKillDialog(lockingProcessManager, token); Logger.Trace($"Kill locking processes: {result}, Launcher needs restart: {true}"); if (!result) { return(new PendingHandledResult(HandlePendingComponentsStatus.Declined, "Update aborted because locked files have not been released.")); } lockingProcessManagerWithoutSelf.Shutdown(); return(new PendingHandledResult(HandlePendingComponentsStatus.Restart)); }
protected internal ICollection <IComponent> GetPendingComponents(ICollection <string> files, out ILockingProcessManager lockingProcessManager) { var components = FindComponentsFromFiles(files).ToList(); lockingProcessManager = LockingProcessManagerFactory.Create(); lockingProcessManager.Register(files); return(components); }
protected virtual Task <PendingHandledResult> HandleLockedComponentsCoreAsync(ICollection <IComponent> pendingComponents, ILockingProcessManager lockingProcessManager, bool ignoreSelfLocked, CancellationToken token) { return(Task.FromResult(new PendingHandledResult(HandlePendingComponentsStatus.Declined, "Handling restart is not implemented"))); }