Files
ThothII/tools/thothctl/internal/compose/process_windows.go
T

52 lines
1.0 KiB
Go

//go:build windows
package compose
import (
"golang.org/x/sys/windows"
"os/exec"
"sync"
)
var ownedJobs = struct {
sync.Mutex
m map[*exec.Cmd]windows.Handle
}{m: make(map[*exec.Cmd]windows.Handle)}
func configureOwnedProcess(c *exec.Cmd) {
c.SysProcAttr = &windows.SysProcAttr{CreationFlags: windows.CREATE_NEW_PROCESS_GROUP}
}
func registerOwnedProcess(c *exec.Cmd) error {
h, err := windows.CreateJobObject(nil, nil)
if err != nil {
return err
}
if err = windows.AssignProcessToJobObject(h, windows.Handle(c.Process.Pid)); err != nil {
windows.CloseHandle(h)
return err
}
ownedJobs.Lock()
ownedJobs.m[c] = h
ownedJobs.Unlock()
return nil
}
func releaseOwnedProcess(c *exec.Cmd) {
ownedJobs.Lock()
h := ownedJobs.m[c]
delete(ownedJobs.m, c)
ownedJobs.Unlock()
if h != 0 {
windows.CloseHandle(h)
}
}
func terminateOwnedProcess(c *exec.Cmd) {
ownedJobs.Lock()
h := ownedJobs.m[c]
ownedJobs.Unlock()
if h != 0 {
_ = windows.TerminateJobObject(h, 1)
} else if c.Process != nil {
_ = c.Process.Kill()
}
}