Hello, all!

There is a part of code:
...
// RunTimeout runs the given command with the given timeout.
// If the command times out, it attempts to kill the process.
func RunTimeout(c *exec.Cmd, timeout time.Duration) error {
       if err := c.Start(); err != nil {
              return err
       }
       return WaitTimeout(c, timeout)
}

// WaitTimeout waits for the given command to finish with a timeout.
// It assumes the command has already been started.
// If the command times out, it attempts to kill the process.
func WaitTimeout(c *exec.Cmd, timeout time.Duration) error {
       timer := time.NewTimer(timeout)
       done := make(chan error)
       go func() { done <- c.Wait() }()
       select {
       case err := <-done:
              timer.Stop()
              return err
       case <-timer.C:
              if err := c.Process.Kill(); err != nil {
                     log.Printf("E! FATAL error killing process: %s", err)
                     return err
              }
              // wait for the command to return after killing it
              <-done
              return errors.New("Command timed out.")
       }
}
...
I think that there will be a goroutine leak in WaitTimeout function when 
c.Process.Kill() return error. Is it true?

Is there any idea for reimplementing this code?

--
Best regards, Yuri

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to