From 1ef224d9bfaf40a552e85132f699b41bf02d55ba Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 18 May 2016 00:14:21 +0700 Subject: [PATCH] make the BlockedFrame queue thread-safe --- session.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/session.go b/session.go index 20a15be8..e907340d 100644 --- a/session.go +++ b/session.go @@ -47,11 +47,12 @@ type Session struct { streams map[protocol.StreamID]*stream streamsMutex sync.RWMutex - sentPacketHandler ackhandler.SentPacketHandler - receivedPacketHandler ackhandler.ReceivedPacketHandler - stopWaitingManager ackhandler.StopWaitingManager - windowUpdateManager *windowUpdateManager - blockedFrameQueue []*frames.BlockedFrame + sentPacketHandler ackhandler.SentPacketHandler + receivedPacketHandler ackhandler.ReceivedPacketHandler + stopWaitingManager ackhandler.StopWaitingManager + windowUpdateManager *windowUpdateManager + blockedFrameQueue []*frames.BlockedFrame + blockedFrameQueueMutex sync.Mutex unpacker *packetUnpacker packer *packetPacker @@ -459,10 +460,12 @@ func (s *Session) sendPacket() error { controlFrames = append(controlFrames, wuf) } + s.blockedFrameQueueMutex.Lock() for _, bf := range s.blockedFrameQueue { controlFrames = append(controlFrames, bf) } s.blockedFrameQueue = s.blockedFrameQueue[:0] + s.blockedFrameQueueMutex.Unlock() ack, err := s.receivedPacketHandler.GetAckFrame(true) if err != nil { @@ -552,6 +555,9 @@ func (s *Session) updateReceiveFlowControlWindow(streamID protocol.StreamID, byt } func (s *Session) streamBlocked(streamID protocol.StreamID) { + s.blockedFrameQueueMutex.Lock() + defer s.blockedFrameQueueMutex.Unlock() + s.blockedFrameQueue = append(s.blockedFrameQueue, &frames.BlockedFrame{StreamID: streamID}) }