mirror of
https://github.com/golang/go
synced 2024-11-19 04:34:39 -07:00
net/http/httptest: clean up unnecessary goroutine
Finishes cleanup which was too late to do when discovered during the Go 1.6 cycle. Fixes #14291 Change-Id: Idc69fadbba10baf246318a22b366709eff088a75 Reviewed-on: https://go-review.googlesource.com/21360 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Andrew Gerrand <adg@golang.org>
This commit is contained in:
parent
e6066711a0
commit
139891e815
@ -202,12 +202,10 @@ func (s *Server) logCloseHangDebugInfo() {
|
|||||||
|
|
||||||
// CloseClientConnections closes any open HTTP connections to the test Server.
|
// CloseClientConnections closes any open HTTP connections to the test Server.
|
||||||
func (s *Server) CloseClientConnections() {
|
func (s *Server) CloseClientConnections() {
|
||||||
var conns int
|
|
||||||
ch := make(chan bool)
|
|
||||||
|
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
|
nconn := len(s.conns)
|
||||||
|
ch := make(chan struct{}, nconn)
|
||||||
for c := range s.conns {
|
for c := range s.conns {
|
||||||
conns++
|
|
||||||
s.closeConnChan(c, ch)
|
s.closeConnChan(c, ch)
|
||||||
}
|
}
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
@ -220,7 +218,7 @@ func (s *Server) CloseClientConnections() {
|
|||||||
// in tests.
|
// in tests.
|
||||||
timer := time.NewTimer(5 * time.Second)
|
timer := time.NewTimer(5 * time.Second)
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
for i := 0; i < conns; i++ {
|
for i := 0; i < nconn; i++ {
|
||||||
select {
|
select {
|
||||||
case <-ch:
|
case <-ch:
|
||||||
case <-timer.C:
|
case <-timer.C:
|
||||||
@ -294,7 +292,7 @@ func (s *Server) closeConn(c net.Conn) { s.closeConnChan(c, nil) }
|
|||||||
|
|
||||||
// closeConnChan is like closeConn, but takes an optional channel to receive a value
|
// closeConnChan is like closeConn, but takes an optional channel to receive a value
|
||||||
// when the goroutine closing c is done.
|
// when the goroutine closing c is done.
|
||||||
func (s *Server) closeConnChan(c net.Conn, done chan<- bool) {
|
func (s *Server) closeConnChan(c net.Conn, done chan<- struct{}) {
|
||||||
if runtime.GOOS == "plan9" {
|
if runtime.GOOS == "plan9" {
|
||||||
// Go's Plan 9 net package isn't great at unblocking reads when
|
// Go's Plan 9 net package isn't great at unblocking reads when
|
||||||
// their underlying TCP connections are closed. Don't trust
|
// their underlying TCP connections are closed. Don't trust
|
||||||
@ -304,20 +302,10 @@ func (s *Server) closeConnChan(c net.Conn, done chan<- bool) {
|
|||||||
s.forgetConn(c)
|
s.forgetConn(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Somewhere in the chaos of https://golang.org/cl/15151 we found that
|
|
||||||
// some types of conns were blocking in Close too long (or deadlocking?)
|
|
||||||
// and we had to call Close in a goroutine. I (bradfitz) forget what
|
|
||||||
// that was at this point, but I suspect it was *tls.Conns, which
|
|
||||||
// were later fixed in https://golang.org/cl/18572, so this goroutine
|
|
||||||
// is _probably_ unnecessary now. But it's too late in Go 1.6 too remove
|
|
||||||
// it with confidence.
|
|
||||||
// TODO(bradfitz): try to remove it for Go 1.7. (golang.org/issue/14291)
|
|
||||||
go func() {
|
|
||||||
c.Close()
|
c.Close()
|
||||||
if done != nil {
|
if done != nil {
|
||||||
done <- true
|
done <- struct{}{}
|
||||||
}
|
}
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// forgetConn removes c from the set of tracked conns and decrements it from the
|
// forgetConn removes c from the set of tracked conns and decrements it from the
|
||||||
|
Loading…
Reference in New Issue
Block a user