diff --git a/common/interrupt/conn.go b/common/interrupt/conn.go index fa0b7655..2b30d85b 100644 --- a/common/interrupt/conn.go +++ b/common/interrupt/conn.go @@ -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() } diff --git a/common/interrupt/group.go b/common/interrupt/group.go index 63ae199e..f0198033 100644 --- a/common/interrupt/group.go +++ b/common/interrupt/group.go @@ -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() } }