mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-12-23 08:45:39 +00:00
recover if p.doSend is closed due to a race between peers.doSendSwitchMsgs and peers.removePeer
This commit is contained in:
parent
f0c249a4b7
commit
cd514799da
@ -166,17 +166,24 @@ func (ps *peers) sendSwitchMsgs() {
|
||||
if p.port == 0 {
|
||||
continue
|
||||
}
|
||||
select {
|
||||
case p.doSend <- struct{}{}:
|
||||
default:
|
||||
}
|
||||
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 {
|
||||
case p.doSend <- struct{}{}:
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
// This must be launched in a separate goroutine by whatever sets up the peer struct.
|
||||
// It handles link protocol traffic.
|
||||
func (p *peer) linkLoop() {
|
||||
go func() { p.doSend <- struct{}{} }()
|
||||
go p.doSendSwitchMsgs()
|
||||
tick := time.NewTicker(time.Second)
|
||||
defer tick.Stop()
|
||||
for {
|
||||
|
Loading…
Reference in New Issue
Block a user