Prevent double waitgroup decrement (#10170)

* Prevent double waitgroup decrement
release/v1.15
zeripath 2020-02-07 09:08:09 +00:00 committed by GitHub
parent d32b65ab68
commit c512bfd09c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 7 additions and 3 deletions

View File

@ -12,6 +12,7 @@ import (
"os" "os"
"strings" "strings"
"sync" "sync"
"sync/atomic"
"syscall" "syscall"
"time" "time"
@ -215,9 +216,12 @@ func (wl *wrappedListener) Accept() (net.Conn, error) {
} }
} }
closed := int32(0)
c = wrappedConn{ c = wrappedConn{
Conn: c, Conn: c,
server: wl.server, server: wl.server,
closed: &closed,
} }
wl.server.wg.Add(1) wl.server.wg.Add(1)
@ -241,12 +245,12 @@ func (wl *wrappedListener) File() (*os.File, error) {
type wrappedConn struct { type wrappedConn struct {
net.Conn net.Conn
server *Server server *Server
closed *int32
} }
func (w wrappedConn) Close() error { func (w wrappedConn) Close() error {
err := w.Conn.Close() if atomic.CompareAndSwapInt32(w.closed, 0, 1) {
if err == nil {
w.server.wg.Done() w.server.wg.Done()
} }
return err return w.Conn.Close()
} }