52 lines
1.0 KiB
Go
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()
|
|
}
|
|
}
|