Fix interrupt group holding lock while closing connections

This commit is contained in:
embogomolov
2026-10-02 18:00:09 +08:00
committed by 世界
parent d41e1745e6
commit d2cf9747d7
2 changed files with 11 additions and 9 deletions
+2 -2
View File
@@ -16,8 +16,8 @@ type Conn struct {
func (c *Conn) Close() error {
c.group.access.Lock()
defer c.group.access.Unlock()
c.group.connections.Remove(c.element)
c.group.access.Unlock()
return c.Conn.Close()
}
@@ -45,8 +45,8 @@ func newPacketConn(group *Group, conn net.PacketConn, element *list.Element[*gro
func (c *PacketConn) Close() error {
c.group.access.Lock()
defer c.group.access.Unlock()
c.group.connections.Remove(c.element)
c.group.access.Unlock()
return c.NetPacketConn.Close()
}
+9 -7
View File
@@ -38,15 +38,17 @@ func (g *Group) NewPacketConn(conn net.PacketConn, isExternal bool) net.PacketCo
func (g *Group) Interrupt(interruptExternalConnections bool) {
g.access.Lock()
defer g.access.Unlock()
var toDelete []*list.Element[*groupConnItem]
for element := g.connections.Front(); element != nil; element = element.Next() {
var closers []io.Closer
for element := g.connections.Front(); element != nil; {
nextElement := element.Next()
if !element.Value.isExternal || interruptExternalConnections {
element.Value.conn.Close()
toDelete = append(toDelete, element)
closers = append(closers, element.Value.conn)
g.connections.Remove(element)
}
element = nextElement
}
for _, element := range toDelete {
g.connections.Remove(element)
g.access.Unlock()
for _, closer := range closers {
closer.Close()
}
}