From 581432eab8d204ee6590fe8c71a5b2199f867d63 Mon Sep 17 00:00:00 2001 From: Soheil Hassas Yeganeh Date: Fri, 31 Jul 2015 19:42:28 -0400 Subject: [PATCH] Mux connections in parallel This commit launches a go-routine for each accepted connection, to match them in parallel. --- cmux.go | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/cmux.go b/cmux.go index 8b38f30..18996d6 100644 --- a/cmux.go +++ b/cmux.go @@ -103,26 +103,30 @@ func (m *cMux) Serve() error { continue } - muc := newMuxConn(c) - matched := false - outer: - for _, sl := range m.sls { - for _, s := range sl.ss { - matched = s(muc.sniffer()) - muc.reset() - if matched { - sl.l.cch <- muc - break outer - } + go m.serve(c) + } +} + +func (m *cMux) serve(c net.Conn) { + muc := newMuxConn(c) + matched := false +outer: + for _, sl := range m.sls { + for _, s := range sl.ss { + matched = s(muc.sniffer()) + muc.reset() + if matched { + sl.l.cch <- muc + break outer } } + } - if !matched { - c.Close() - err := ErrNotMatched{c: c} - if !m.handleErr(err) { - return err - } + if !matched { + c.Close() + err := ErrNotMatched{c: c} + if !m.handleErr(err) { + m.root.Close() } } }