mirror of https://github.com/v2ray/v2ray-core
Fix race condition
parent
94d4b02191
commit
205f8b382d
|
@ -109,7 +109,6 @@ type Connection struct {
|
||||||
state State
|
state State
|
||||||
stateBeginTime uint32
|
stateBeginTime uint32
|
||||||
lastIncomingTime uint32
|
lastIncomingTime uint32
|
||||||
sendingUpdated bool
|
|
||||||
lastPingTime uint32
|
lastPingTime uint32
|
||||||
|
|
||||||
mss uint32
|
mss uint32
|
||||||
|
@ -463,13 +462,13 @@ func (this *Connection) flush() {
|
||||||
}
|
}
|
||||||
this.output.Write(seg)
|
this.output.Write(seg)
|
||||||
this.lastPingTime = current
|
this.lastPingTime = current
|
||||||
this.sendingUpdated = false
|
this.sendingWorker.MarkPingNecessary(false)
|
||||||
|
this.receivingWorker.MarkPingNecessary(false)
|
||||||
seg.Release()
|
seg.Release()
|
||||||
}
|
}
|
||||||
|
|
||||||
// flash remain segments
|
// flash remain segments
|
||||||
this.output.Flush()
|
this.output.Flush()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Connection) State() State {
|
func (this *Connection) State() State {
|
||||||
|
|
|
@ -173,7 +173,7 @@ func (this *AckList) Flush(current uint32, rto uint32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReceivingWorker struct {
|
type ReceivingWorker struct {
|
||||||
sync.Mutex
|
sync.RWMutex
|
||||||
conn *Connection
|
conn *Connection
|
||||||
queue *ReceivingQueue
|
queue *ReceivingQueue
|
||||||
window *ReceivingWindow
|
window *ReceivingWindow
|
||||||
|
@ -267,5 +267,13 @@ func (this *ReceivingWorker) CloseRead() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *ReceivingWorker) PingNecessary() bool {
|
func (this *ReceivingWorker) PingNecessary() bool {
|
||||||
|
this.RLock()
|
||||||
|
defer this.RUnlock()
|
||||||
return this.updated
|
return this.updated
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *ReceivingWorker) MarkPingNecessary(b bool) {
|
||||||
|
this.Lock()
|
||||||
|
defer this.Unlock()
|
||||||
|
this.updated = b
|
||||||
|
}
|
||||||
|
|
|
@ -227,7 +227,7 @@ func (this *SendingQueue) Len() uint32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
type SendingWorker struct {
|
type SendingWorker struct {
|
||||||
sync.Mutex
|
sync.RWMutex
|
||||||
conn *Connection
|
conn *Connection
|
||||||
window *SendingWindow
|
window *SendingWindow
|
||||||
queue *SendingQueue
|
queue *SendingQueue
|
||||||
|
@ -347,9 +347,19 @@ func (this *SendingWorker) Write(seg Segment) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *SendingWorker) PingNecessary() bool {
|
func (this *SendingWorker) PingNecessary() bool {
|
||||||
|
this.RLock()
|
||||||
|
defer this.RUnlock()
|
||||||
|
|
||||||
return this.updated
|
return this.updated
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *SendingWorker) MarkPingNecessary(b bool) {
|
||||||
|
this.Lock()
|
||||||
|
defer this.Unlock()
|
||||||
|
|
||||||
|
this.updated = b
|
||||||
|
}
|
||||||
|
|
||||||
func (this *SendingWorker) OnPacketLoss(lossRate uint32) {
|
func (this *SendingWorker) OnPacketLoss(lossRate uint32) {
|
||||||
if !effectiveConfig.Congestion || this.conn.roundTrip.Timeout() == 0 {
|
if !effectiveConfig.Congestion || this.conn.roundTrip.Timeout() == 0 {
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue