utils: Make WaitLocalProcess safer
Rather than relying on the system clock, use a channel timeout to avoid
problems if the system time changed.
@@ -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 {
