* Prevent double waitgroup decrement Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
parent
e48b460a0a
commit
6af58022c8
1 changed files with 7 additions and 3 deletions
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue