From 20e41dd6bdc1579a33be62c4ba373cbd93cee898 Mon Sep 17 00:00:00 2001 From: xtaci Date: Wed, 17 Apr 2019 21:29:58 +0800 Subject: [PATCH] make sure streamLock is non-blocking due to receiveBytes --- session.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/session.go b/session.go index 8dd847c..c1160d0 100644 --- a/session.go +++ b/session.go @@ -248,20 +248,18 @@ func (s *Session) recvLoop() { } s.streamLock.Unlock() case cmdPSH: - var written int64 - var err error s.streamLock.Lock() - if stream, ok := s.streams[sid]; ok { - written, err = stream.receiveBytes(s.conn, int64(hdr.Length())) - atomic.AddInt32(&s.bucket, -int32(written)) - stream.notifyReadEvent() - } + stream := s.streams[sid] s.streamLock.Unlock() - // read data error - if err != nil { - s.Close() - return + if stream != nil { + written, err := stream.receiveBytes(s.conn, int64(hdr.Length())) + atomic.AddInt32(&s.bucket, -int32(written)) + stream.notifyReadEvent() + if err != nil { + s.Close() + return + } } default: s.Close()