|
1 | 1 | module MinEdLauncher.Process |
2 | 2 |
|
| 3 | +open System |
3 | 4 | open System.ComponentModel |
4 | 5 | open System.Diagnostics |
| 6 | +open MinEdLauncher.Types |
5 | 7 |
|
6 | | -let launchProcesses printOutput (processes:ProcessStartInfo list) = |
| 8 | +let launchProcesses printOutput (processes:LauncherProcess list) = |
7 | 9 | processes |
8 | | - |> List.choose (fun p -> |
| 10 | + |> List.choose (fun l -> |
9 | 11 | try |
10 | | - let p = Process.Start(p) |
| 12 | + let p = Process.Start(l.StartInfo) |
11 | 13 | p.BeginErrorReadLine() |
12 | 14 | p.BeginOutputReadLine() |
13 | 15 |
|
14 | 16 | if printOutput then |
15 | 17 | p.OutputDataReceived.Add(fun a -> if a.Data <> null then printfn $" %s{a.Data}") |
16 | 18 | p.ErrorDataReceived.Add(fun a -> if a.Data <> null then printfn $" %s{a.Data}") |
17 | 19 |
|
18 | | - p |> Some |
| 20 | + (p, l) |> Some |
19 | 21 | with |
20 | 22 | | :? Win32Exception as e -> |
21 | | - Log.exn e $"""Unable to start process %s{p.FileName} |
| 23 | + Log.exn e $"""Unable to start process %s{l.Name} |
22 | 24 | HRESULT: 0x{e.ErrorCode:X} |
23 | 25 | Win32 Error Code: {e.NativeErrorCode} |
24 | 26 | """ |
25 | 27 | None |
26 | 28 | | e -> |
27 | | - Log.exn e $"Unable to start process %s{p.FileName}" |
| 29 | + Log.exn e $"Unable to start process %s{l.Name}" |
28 | 30 | None) |
29 | 31 |
|
30 | | -let stopProcesses timeout (processes: Process list) = |
| 32 | +let stopProcesses (timeout: TimeSpan) (processes: (Process * LauncherProcess) list) = |
31 | 33 | processes |
32 | | - |> List.iter (fun p -> |
| 34 | + |> List.iter (fun (p, l) -> |
33 | 35 | use p = p |
34 | 36 | if p.HasExited then |
35 | 37 | Log.debug $"Process %i{p.Id} already exited" |
36 | 38 | else |
37 | | - Log.debug $"Stopping process %s{p.ProcessName}" |
38 | | - match Interop.termProcess timeout p with |
39 | | - | Ok () -> |
40 | | - Log.info $"Stopped process %s{p.ProcessName}" |
41 | | - | Error msg -> Log.warn msg) |
| 39 | + let name = match l with Host _ -> p.ProcessName | Flatpak _ -> l.Name |
| 40 | + Log.debug $"Stopping process %s{name}" |
| 41 | + match l.ShutdownCommand with |
| 42 | + | Some startInfo -> |
| 43 | + try |
| 44 | + use p = Process.Start(startInfo) |
| 45 | + if not (p.WaitForExit(timeout)) then |
| 46 | + Log.warn $"Process did not exit within %i{int timeout.TotalSeconds} seconds" |
| 47 | + else |
| 48 | + Log.info $"Stopped process %s{name}" |
| 49 | + with e -> Log.exn e $"Failed to stop process %s{name}" |
| 50 | + | None -> |
| 51 | + match Interop.termProcess timeout p with |
| 52 | + | Ok () -> Log.info $"Stopped process %s{name}" |
| 53 | + | Error msg -> Log.warn msg) |
42 | 54 |
|
43 | 55 | let waitForExit (processes: Process list) = |
44 | 56 | processes |
|
0 commit comments