From 653c057958f9c1ccb167b1cedfa356a3b05e342d Mon Sep 17 00:00:00 2001 From: kingecg Date: Fri, 30 May 2025 21:14:54 +0800 Subject: [PATCH] add Remove listener method on cmux --- cmux.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/cmux.go b/cmux.go index 5ba921e..7fbba0d 100644 --- a/cmux.go +++ b/cmux.go @@ -103,6 +103,8 @@ type CMux interface { HandleError(ErrorHandler) // sets a timeout for the read of matchers SetReadTimeout(time.Duration) + + Remove(l net.Listener) error } type matchersListener struct { @@ -216,6 +218,34 @@ func (m *cMux) Close() { m.closeDoneChans() } +func (m *cMux) Remove(l net.Listener) error { + + if l == nil { + return errors.New("mux: nil listener") + } + if l == m.root { + return errors.New("mux: cannot remove root listener") + } + cl, ok := l.(muxListener) + if !ok { + return fmt.Errorf("mux: listener %v is not a mux listener", l) + } + + m.mu.Lock() + defer m.mu.Unlock() + + for i, sl := range m.sls { + if sl.l.Listener == l { + + cl.donec <- struct{}{} + m.sls = append(m.sls[:i], m.sls[i+1:]...) + return nil + } + } + + return fmt.Errorf("mux: listener %v not found", l) +} + func (m *cMux) closeDoneChans() { m.mu.Lock() defer m.mu.Unlock()