From e80e401c7eca20fa2c13abc85306f55c94b5c4d1 Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Tue, 26 Dec 2023 19:16:52 +0100 Subject: [PATCH] service/dap: fix close on closed channel (#3609) This fixes an infrequent close on closed channel panic in service/dap caused by a race condition with closing a channel. --- service/dap/server.go | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/service/dap/server.go b/service/dap/server.go index e3f2dbbb..98467634 100644 --- a/service/dap/server.go +++ b/service/dap/server.go @@ -181,26 +181,22 @@ type Config struct { } type connection struct { + mu sync.Mutex + closed bool io.ReadWriteCloser - closed chan struct{} } func (c *connection) Close() error { - select { - case <-c.closed: - default: - close(c.closed) - } + c.mu.Lock() + defer c.mu.Unlock() + c.closed = true return c.ReadWriteCloser.Close() } func (c *connection) isClosed() bool { - select { - case <-c.closed: - return true - default: - return false - } + c.mu.Lock() + defer c.mu.Unlock() + return c.closed } type process struct { @@ -339,7 +335,7 @@ func NewSession(conn io.ReadWriteCloser, config *Config, debugger *debugger.Debu return &Session{ config: config, id: sessionCount, - conn: &connection{conn, make(chan struct{})}, + conn: &connection{ReadWriteCloser: conn}, stackFrameHandles: newHandlesMap(), variableHandles: newVariablesHandlesMap(), args: defaultArgs,