From 990db79996793dbf6057b182726be3a3e52d75c9 Mon Sep 17 00:00:00 2001 From: wz <37008932+CryBecase@users.noreply.github.com> Date: Sat, 24 Jul 2021 20:27:43 +0800 Subject: [PATCH] fix: resolve the data race of stdConn on Windows (#235) --- acceptor_windows.go | 4 ++-- errors/errors.go | 2 ++ eventloop_windows.go | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/acceptor_windows.go b/acceptor_windows.go index 309de4045..436e9eece 100644 --- a/acceptor_windows.go +++ b/acceptor_windows.go @@ -62,9 +62,9 @@ func (svr *server) listenerRun(lockOSThread bool) { go func() { var buffer [0x10000]byte for { - n, err := c.conn.Read(buffer[:]) + n, err := conn.Read(buffer[:]) if err != nil { - _ = c.conn.SetReadDeadline(time.Time{}) + _ = conn.SetReadDeadline(time.Time{}) el.ch <- &stderr{c, err} return } diff --git a/errors/errors.go b/errors/errors.go index 5041f15d6..b21dcab97 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -41,6 +41,8 @@ var ( ErrUnsupportedUDSProtocol = errors.New("only unix is supported") // ErrUnsupportedPlatform occurs when running gnet on an unsupported platform. ErrUnsupportedPlatform = errors.New("unsupported platform in gnet") + // ErrConnectionClosed occurs when the event-loop receives a closed connection. + ErrConnectionClosed = errors.New("connection is closed") // ================================================= codec errors =================================================. diff --git a/eventloop_windows.go b/eventloop_windows.go index e5b2f472a..106d93aa8 100644 --- a/eventloop_windows.go +++ b/eventloop_windows.go @@ -84,6 +84,10 @@ func (el *eventloop) loopRun(lockOSThread bool) { case *stdConn: err = el.loopAccept(v) case *tcpConn: + if v.c.conn == nil { + err = errors.ErrConnectionClosed + break + } v.c.buffer = v.bb err = el.loopRead(v.c) case *udpConn: @@ -102,7 +106,7 @@ func (el *eventloop) loopRun(lockOSThread bool) { el.getLogger().Debugf("event-loop(%d) is exiting in terms of the demand from user, %v", el.idx, err) break } else if err != nil { - el.getLogger().Errorf("event-loop(%d) is exiting due to the error: %v", el.idx, err) + el.getLogger().Debugf("event-loop(%d) got a nonlethal error: %v", el.idx, err) } } }