Pārlūkot izejas kodu

stop doing anything after being released. fixes #804

Darien Raymond 7 gadi atpakaļ
vecāks
revīzija
4783b8f2c6
1 mainītis faili ar 16 papildinājumiem un 1 dzēšanām
  1. 16 1
      transport/internet/kcp/sending.go

+ 16 - 1
transport/internet/kcp/sending.go

@@ -191,11 +191,12 @@ type SendingWorker struct {
 	conn                       *Connection
 	window                     *SendingWindow
 	firstUnacknowledged        uint32
-	firstUnacknowledgedUpdated bool
 	nextNumber                 uint32
 	remoteNextNumber           uint32
 	controlWindow              uint32
 	fastResend                 uint32
+	firstUnacknowledgedUpdated bool
+	closed                     bool
 }
 
 func NewSendingWorker(kcp *Connection) *SendingWorker {
@@ -212,6 +213,7 @@ func NewSendingWorker(kcp *Connection) *SendingWorker {
 func (w *SendingWorker) Release() {
 	w.Lock()
 	w.window.Release()
+	w.closed = true
 	w.Unlock()
 }
 
@@ -258,6 +260,10 @@ func (w *SendingWorker) ProcessSegment(current uint32, seg *AckSegment, rto uint
 	w.Lock()
 	defer w.Unlock()
 
+	if w.closed {
+		return
+	}
+
 	if w.remoteNextNumber < seg.ReceivingWindow {
 		w.remoteNextNumber = seg.ReceivingWindow
 	}
@@ -289,6 +295,10 @@ func (w *SendingWorker) Push(f buf.Supplier) bool {
 	w.Lock()
 	defer w.Unlock()
 
+	if w.closed {
+		return false
+	}
+
 	if w.window.IsFull() {
 		return false
 	}
@@ -333,6 +343,11 @@ func (w *SendingWorker) OnPacketLoss(lossRate uint32) {
 func (w *SendingWorker) Flush(current uint32) {
 	w.Lock()
 
+	if w.closed {
+		w.Unlock()
+		return
+	}
+
 	cwnd := w.firstUnacknowledged + w.conn.Config.GetSendingInFlightSize()
 	if cwnd > w.remoteNextNumber {
 		cwnd = w.remoteNextNumber