utils: Make WaitLocalProcess safer

Rather than relying on the system clock, use a channel timeout to avoid
problems if the system time changed.

Signed-off-by: James O. D. Hunt <james.o.hunt@intel.com>
This commit is contained in:
James O. D. Hunt 2021-04-15 15:44:57 +01:00
parent 9256e590dc
commit de2631e711

View File

@ -345,10 +345,16 @@ func WaitLocalProcess(pid int, timeoutSecs uint, initialSignal syscall.Signal, l
pidRunning := true
// Wait for the VM process to terminate
startTime := time.Now()
secs := time.Duration(timeoutSecs)
timeout := time.After(secs * time.Second)
// Wait for the VM process to terminate
outer:
for {
select {
case <-time.After(50 * time.Millisecond):
// Check if the process is running periodically to avoid a busy loop
var _status syscall.WaitStatus
var _rusage syscall.Rusage
var waitedPid int
@ -358,24 +364,21 @@ func WaitLocalProcess(pid int, timeoutSecs uint, initialSignal syscall.Signal, l
if waitedPid == pid && err == nil {
pidRunning = false
break
break outer
}
if err = syscall.Kill(pid, syscall.Signal(0)); err != nil {
pidRunning = false
break
break outer
}
if time.Since(startTime).Seconds() >= float64(timeoutSecs) {
pidRunning = true
break
case <-timeout:
logger.Warnf("process %v still running after waiting %ds", pid, timeoutSecs)
break
break outer
}
// Brief pause to avoid a busy loop
time.Sleep(time.Duration(50) * time.Millisecond)
}
if pidRunning {