fix: complete P2 host workspace contract

This commit is contained in:
2026-08-11 00:39:44 +02:00
parent ccaf8c1be0
commit 9df7c38069
13 changed files with 849 additions and 252 deletions
@@ -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()
}
}