Fix race condition

pull/215/head
v2ray 2016-07-12 17:56:36 +02:00
parent 94d4b02191
commit 205f8b382d
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
3 changed files with 22 additions and 5 deletions

View File

@ -109,7 +109,6 @@ type Connection struct {
state State
stateBeginTime uint32
lastIncomingTime uint32
sendingUpdated bool
lastPingTime uint32
mss uint32
@ -463,13 +462,13 @@ func (this *Connection) flush() {
}
this.output.Write(seg)
this.lastPingTime = current
this.sendingUpdated = false
this.sendingWorker.MarkPingNecessary(false)
this.receivingWorker.MarkPingNecessary(false)
seg.Release()
}
// flash remain segments
this.output.Flush()
}
func (this *Connection) State() State {

View File

@ -173,7 +173,7 @@ func (this *AckList) Flush(current uint32, rto uint32) {
}
type ReceivingWorker struct {
sync.Mutex
sync.RWMutex
conn *Connection
queue *ReceivingQueue
window *ReceivingWindow
@ -267,5 +267,13 @@ func (this *ReceivingWorker) CloseRead() {
}
func (this *ReceivingWorker) PingNecessary() bool {
this.RLock()
defer this.RUnlock()
return this.updated
}
func (this *ReceivingWorker) MarkPingNecessary(b bool) {
this.Lock()
defer this.Unlock()
this.updated = b
}

View File

@ -227,7 +227,7 @@ func (this *SendingQueue) Len() uint32 {
}
type SendingWorker struct {
sync.Mutex
sync.RWMutex
conn *Connection
window *SendingWindow
queue *SendingQueue
@ -347,9 +347,19 @@ func (this *SendingWorker) Write(seg Segment) {
}
func (this *SendingWorker) PingNecessary() bool {
this.RLock()
defer this.RUnlock()
return this.updated
}
func (this *SendingWorker) MarkPingNecessary(b bool) {
this.Lock()
defer this.Unlock()
this.updated = b
}
func (this *SendingWorker) OnPacketLoss(lossRate uint32) {
if !effectiveConfig.Congestion || this.conn.roundTrip.Timeout() == 0 {
return