Simplify shimProcess accept and wait
That we pull a value out of a channel and put it back is pretty weird.
Also we don't need a select in accept(). It's enough to just close the
listener when we learn the child is gone. (That will cancel the
Accept call.)
Change-Id: If520d9f405fa0b1ad6e3cd23e9ba8a35ff39ba75
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/60887
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go
index e7ee194..954f2a2 100644
--- a/ssl/test/runner/runner.go
+++ b/ssl/test/runner/runner.go
@@ -1248,8 +1248,11 @@
)
type shimProcess struct {
- cmd *exec.Cmd
- waitChan chan error
+ cmd *exec.Cmd
+ // done is closed when the process has exited. At that point, childErr may be
+ // read for the result.
+ done chan struct{}
+ childErr error
listener *net.TCPListener
stdout, stderr bytes.Buffer
}
@@ -1297,37 +1300,22 @@
return nil, err
}
- shim.waitChan = make(chan error, 1)
- go func() { shim.waitChan <- shim.cmd.Wait() }()
+ shim.done = make(chan struct{})
+ go func() {
+ shim.childErr = shim.cmd.Wait()
+ shim.listener.Close()
+ close(shim.done)
+ }()
return shim, nil
}
// accept returns a new TCP connection with the shim process, or returns an
// error on timeout or shim exit.
func (s *shimProcess) accept() (net.Conn, error) {
- type connOrError struct {
- conn net.Conn
- err error
+ if !useDebugger() {
+ s.listener.SetDeadline(time.Now().Add(*idleTimeout))
}
- connChan := make(chan connOrError, 1)
- go func() {
- if !useDebugger() {
- s.listener.SetDeadline(time.Now().Add(*idleTimeout))
- }
- conn, err := s.listener.Accept()
- connChan <- connOrError{conn, err}
- close(connChan)
- }()
- select {
- case result := <-connChan:
- return result.conn, result.err
- case childErr := <-s.waitChan:
- s.waitChan <- childErr
- if childErr == nil {
- return nil, fmt.Errorf("child exited early with no error")
- }
- return nil, fmt.Errorf("child exited early: %s", childErr)
- }
+ return s.listener.Accept()
}
// wait finishes the test and waits for the shim process to exit.
@@ -1343,9 +1331,8 @@
defer waitTimeout.Stop()
}
- err := <-s.waitChan
- s.waitChan <- err
- return err
+ <-s.done
+ return s.childErr
}
// close releases resources associated with the shimProcess. This is safe to