add Remove listener method on cmux

This commit is contained in:
kingecg 2025-05-30 21:14:54 +08:00
parent 5ec6847320
commit 653c057958
1 changed files with 30 additions and 0 deletions

30
cmux.go
View File

@ -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()