From 981414d92cd4e955ec0a7d8ea6b58550413a55b0 Mon Sep 17 00:00:00 2001 From: lc6464 <64722907+lc6464@users.noreply.github.com> Date: Tue, 24 Mar 2026 21:24:46 +0800 Subject: [PATCH] refactor(pico): make connCount a regular int guarded by connsMu --- pkg/channels/pico/pico.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pkg/channels/pico/pico.go b/pkg/channels/pico/pico.go index 96858028f..ab93f18b3 100644 --- a/pkg/channels/pico/pico.go +++ b/pkg/channels/pico/pico.go @@ -59,7 +59,7 @@ type PicoChannel struct { connections map[string]*picoConn // connID -> *picoConn sessionConnections map[string]map[string]*picoConn // sessionID -> connID -> *picoConn connsMu sync.RWMutex - connCount atomic.Int32 + connCount int ctx context.Context cancel context.CancelFunc } @@ -125,7 +125,7 @@ func (c *PicoChannel) createAndAddConnection(conn *websocket.Conn, sessionID str c.sessionConnections[pc.sessionID] = bySession } bySession[pc.id] = pc - c.connCount.Add(1) + c.connCount++ return pc } @@ -147,7 +147,7 @@ func (c *PicoChannel) removeConnection(connID string) *picoConn { delete(c.sessionConnections, pc.sessionID) } } - c.connCount.Add(-1) + c.connCount-- return pc } @@ -163,7 +163,7 @@ func (c *PicoChannel) takeAllConnections() []*picoConn { } clear(c.connections) clear(c.sessionConnections) - c.connCount.Store(0) + c.connCount = 0 return all } @@ -185,6 +185,13 @@ func (c *PicoChannel) sessionConnectionsSnapshot(sessionID string) []*picoConn { return conns } +// currentConnCount returns a lock-protected snapshot of active connection count. +func (c *PicoChannel) currentConnCount() int { + c.connsMu.RLock() + defer c.connsMu.RUnlock() + return c.connCount +} + // Start implements Channel. func (c *PicoChannel) Start(ctx context.Context) error { logger.InfoC("pico", "Starting Pico Protocol channel") @@ -329,7 +336,7 @@ func (c *PicoChannel) handleWebSocket(w http.ResponseWriter, r *http.Request) { if maxConns <= 0 { maxConns = 100 } - if int(c.connCount.Load()) >= maxConns { + if c.currentConnCount() >= maxConns { http.Error(w, "too many connections", http.StatusServiceUnavailable) return }