fix: complete P2 host workspace contract
This commit is contained in:
@@ -1,5 +1,51 @@
|
||||
//go:build windows
|
||||
|
||||
package compose
|
||||
import ("os/exec"; "syscall")
|
||||
func configureOwnedProcess(c *exec.Cmd) { c.SysProcAttr=&syscall.SysProcAttr{} }
|
||||
func terminateOwnedProcess(c *exec.Cmd) { if c.Process!=nil { _=c.Process.Kill() } }
|
||||
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user