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