diff --git a/acceptor.go b/acceptor.go index f5b9b281c..a2f136a0f 100644 --- a/acceptor.go +++ b/acceptor.go @@ -340,9 +340,9 @@ func (a *Acceptor) handleConnection(netConn net.Conn) { a.globalLog.OnEventf("Dynamic session %v failed to create: %v", sessID, err) return } + a.sessions[sessID] = dynamicSession a.dynamicSessionChan <- dynamicSession session = dynamicSession - defer session.stop() } a.sessionAddr.Store(sessID, netConn.RemoteAddr()) @@ -363,52 +363,16 @@ func (a *Acceptor) handleConnection(netConn net.Conn) { } func (a *Acceptor) dynamicSessionsLoop() { - var id int - var sessions = map[int]*session{} - var complete = make(chan int) - defer close(complete) -LOOP: for { - select { - case session, ok := <-a.dynamicSessionChan: - if !ok { - for _, oldSession := range sessions { - oldSession.stop() - } - break LOOP - } - id++ - sessionID := id - sessions[sessionID] = session - go func() { - session.run() - err := UnregisterSession(session.sessionID) - if err != nil { - a.globalLog.OnEventf("Unregister dynamic session %v failed: %v", session.sessionID, err) - return - } - complete <- sessionID - }() - case id := <-complete: - session, ok := sessions[id] - if ok { - a.sessionAddr.Delete(session.sessionID) - delete(sessions, id) - } else { - a.globalLog.OnEventf("Missing dynamic session %v!", id) - } - } - } - - if len(sessions) == 0 { - return - } - - for id := range complete { - delete(sessions, id) - if len(sessions) == 0 { - return + session, ok := <-a.dynamicSessionChan + if !ok { + break } + a.sessionGroup.Add(1) + go func() { + session.run() + a.sessionGroup.Done() + }() } }