From 2db968bbe37a0bc650bc150402ddf2519dd57042 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sat, 17 Jul 2021 22:05:48 +0800 Subject: [PATCH] feat(server): use a in-place removal to clean closed ws conn. --- server/websocket.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/server/websocket.go b/server/websocket.go index 9e3feaa..b49ba29 100644 --- a/server/websocket.go +++ b/server/websocket.go @@ -385,24 +385,23 @@ func (s *webSocketServer) onBotPushEvent(e *coolq.Event) { log.Debugf("上报Event %s 到 WS客户端 时被过滤.", e.JSONBytes()) return } - - for i, l := 0, len(s.eventConn); i < l; i++ { + j := 0 + for i := 0; i < len(s.eventConn); i++ { conn := s.eventConn[i] log.Debugf("向WS客户端 %v 推送Event: %s", conn.RemoteAddr().String(), e.JSONBytes()) conn.Lock() if err := conn.WriteMessage(websocket.TextMessage, e.JSONBytes()); err != nil { _ = conn.Close() - next := i + 1 - if next >= l { - next = l - 1 - } - s.eventConn[i], s.eventConn[next] = s.eventConn[next], s.eventConn[i] - s.eventConn = append(s.eventConn[:next], s.eventConn[next+1:]...) - i-- - l-- conn = nil continue } + if i != j { + // i != j means that some connection has been closed. + // use a in-place removal to avoid copying. + s.eventConn[j] = conn + } conn.Unlock() + j++ } + s.eventConn = s.eventConn[:j] }