Use stable Windows process handles for job assignment
This commit is contained in:
@@ -273,7 +273,7 @@ error presentation at the existing adapter-facing boundary.
|
|||||||
|
|
||||||
## Stage 3 — Use The Stable Windows Process Handle
|
## Stage 3 — Use The Stable Windows Process Handle
|
||||||
|
|
||||||
**Status: Pending**
|
**Status: Completed**
|
||||||
|
|
||||||
### Goal
|
### Goal
|
||||||
|
|
||||||
|
|||||||
@@ -39,19 +39,23 @@ func (tree *windowsProcessTree) Start(cmd *exec.Cmd) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
process, err := windows.OpenProcess(windows.PROCESS_SET_QUOTA|windows.PROCESS_TERMINATE, false, uint32(cmd.Process.Pid))
|
var assignErr error
|
||||||
if err == nil {
|
withHandleErr := cmd.Process.WithHandle(func(handle uintptr) {
|
||||||
err = windows.AssignProcessToJobObject(job, process)
|
assignErr = windows.AssignProcessToJobObject(job, windows.Handle(handle))
|
||||||
_ = windows.CloseHandle(process)
|
})
|
||||||
|
if withHandleErr == nil && assignErr == nil {
|
||||||
|
assignErr = resumeInitialThread(uint32(cmd.Process.Pid))
|
||||||
}
|
}
|
||||||
if err == nil {
|
if withHandleErr != nil || assignErr != nil {
|
||||||
err = resumeInitialThread(uint32(cmd.Process.Pid))
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
killErr := cmd.Process.Kill()
|
killErr := cmd.Process.Kill()
|
||||||
waitErr := cmd.Wait()
|
waitErr := cmd.Wait()
|
||||||
_ = windows.CloseHandle(job)
|
_ = windows.CloseHandle(job)
|
||||||
return joinErrors(fmt.Errorf("assign process to job object: %w", err), killErr, waitErr)
|
return joinErrors(
|
||||||
|
fmt.Errorf("acquire process handle for job assignment: %w", withHandleErr),
|
||||||
|
fmt.Errorf("assign process to job object or resume initial thread: %w", assignErr),
|
||||||
|
killErr,
|
||||||
|
waitErr,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
tree.job = job
|
tree.job = job
|
||||||
|
|||||||
Reference in New Issue
Block a user