//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() } }