From f04efab52fd05cbd1b25280ae54423fc7b12e267 Mon Sep 17 00:00:00 2001 From: David Justice Date: Wed, 1 Aug 2018 09:14:34 -0700 Subject: [PATCH] add read from link.rx when sending a detach to eliminate deadlock on send --- client.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/client.go b/client.go index 4a4e62c5..d1bf9c16 100644 --- a/client.go +++ b/client.go @@ -1307,13 +1307,24 @@ func (l *link) muxDetach() { Closed: true, Error: detachError, } - select { - case l.session.tx <- fr: - case <-l.session.done: - if l.err == nil { - l.err = l.session.err + +Loop: + for { + select { + case l.session.tx <- fr: + // after sending the detach frame, break the read loop + break Loop + case fr := <-l.rx: + // discard incoming frames to avoid blocking session.mux + if fr, ok := fr.(*performDetach); ok && fr.Closed { + l.detachReceived = true + } + case <-l.session.done: + if l.err == nil { + l.err = l.session.err + } + return } - return } // don't wait for remote to detach when already