5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-23 00:51:35 +00:00

recover if p.doSend is closed due to a race between peers.doSendSwitchMsgs and peers.removePeer

This commit is contained in:
Arceliar 2018-06-13 00:24:12 -05:00
parent f0c249a4b7
commit cd514799da

View File

@ -166,17 +166,24 @@ func (ps *peers) sendSwitchMsgs() {
if p.port == 0 { if p.port == 0 {
continue continue
} }
p.doSendSwitchMsgs()
}
}
// If called, sends a notification to the peer's linkLoop to trigger a switchMsg send.
// Mainly called by sendSwitchMsgs or during linkLoop startup.
func (p *peer) doSendSwitchMsgs() {
defer func() { recover() }() // In case there's a race with close(p.doSend)
select { select {
case p.doSend <- struct{}{}: case p.doSend <- struct{}{}:
default: default:
} }
}
} }
// This must be launched in a separate goroutine by whatever sets up the peer struct. // This must be launched in a separate goroutine by whatever sets up the peer struct.
// It handles link protocol traffic. // It handles link protocol traffic.
func (p *peer) linkLoop() { func (p *peer) linkLoop() {
go func() { p.doSend <- struct{}{} }() go p.doSendSwitchMsgs()
tick := time.NewTicker(time.Second) tick := time.NewTicker(time.Second)
defer tick.Stop() defer tick.Stop()
for { for {