wgengine/magicsock: shortcircuit discoEndpoint.heartbeat when its connection is closed
This prevents us from continuing to do unnecessary work
(including logging) after the connection has closed.
@@ -2280,6 +2280,13 @@ func (c *Conn) Close() error {
return err
}
+// isClosed reports whether c is closed.
+func (c *Conn) isClosed() bool {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+ return c.closed
+}
+
func (c *Conn) goroutinesRunningLocked() bool {
if c.endpointsUpdateActive {
return true
@@ -3017,6 +3024,10 @@ func (de *discoEndpoint) heartbeat() {
de.heartBeatTimer = nil
+ if de.c.isClosed() {
+ return
+ }
+
if de.lastSend.IsZero() {
// Shouldn't happen.
return
