From 2bea2df6a1f401a381550466677e53126a1429e3 Mon Sep 17 00:00:00 2001 From: SVLAVR Date: Mon, 12 Oct 2026 09:56:24 +0300 Subject: [PATCH] Hysteria client: Release client map lock before cleanup (#7122) https://github.com/XTLS/Xray-core/pull/7122#issuecomment-6119280343 --- transport/internet/hysteria/dialer.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/transport/internet/hysteria/dialer.go b/transport/internet/hysteria/dialer.go index c652b40aa..1d7b8a95e 100644 --- a/transport/internet/hysteria/dialer.go +++ b/transport/internet/hysteria/dialer.go @@ -300,23 +300,21 @@ type clientManager struct { func (m *clientManager) clean() { ticker := time.NewTicker(idleCleanupInterval) for range ticker.C { - var forced []dialerConf - m.RLock() + entries := make(map[dialerConf]*client, len(m.m)) for k, c := range m.m { + entries[k] = c + } + m.RUnlock() + for k, c := range entries { force := c.instance != nil && !c.instance.IsRunning() c.clean(force) if force { - forced = append(forced, k) + m.Lock() + delete(m.m, k) + m.Unlock() } } - m.RUnlock() - - for i := range forced { - m.Lock() - delete(m.m, forced[i]) - m.Unlock() - } } }