Browse Source

server: prevent race during resched pump on a closed stream

Fixes #44
Perry Abbott 10 years ago
parent
commit
3d069f6a7b
1 changed files with 4 additions and 1 deletions
  1. 4 1
      server.go

+ 4 - 1
server.go

@@ -631,6 +631,9 @@ func (sc *serverConn) serve() {
 		case wm := <-sc.wantWriteFrameCh:
 			sc.writeFrame(wm)
 		case <-sc.wroteFrameCh:
+			if sc.writingFrame != true {
+				panic("internal error: expected to be already writing a frame")
+			}
 			sc.writingFrame = false
 			sc.scheduleFrameWrite()
 		case fg, ok := <-sc.readFrameCh:
@@ -752,6 +755,7 @@ func (sc *serverConn) startFrameWrite(wm frameWriteMsg) {
 	if sc.writingFrame {
 		panic("internal error: can only be writing one frame at a time")
 	}
+	sc.writingFrame = true
 
 	st := wm.stream
 	if st != nil {
@@ -768,7 +772,6 @@ func (sc *serverConn) startFrameWrite(wm frameWriteMsg) {
 		}
 	}
 
-	sc.writingFrame = true
 	sc.needsFrameFlush = true
 	if endsStream(wm.write) {
 		if st == nil {