Merge pull request #117 from Arceliar/panicfix

closed channel send bugfix
This commit is contained in:
Arceliar 2018-06-13 00:33:48 -05:00 committed by GitHub
commit ad1ba2c8ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -166,17 +166,24 @@ func (ps *peers) sendSwitchMsgs() {
if p.port == 0 { if p.port == 0 {
continue continue
} }
select { p.doSendSwitchMsgs()
case p.doSend <- struct{}{}: }
default: }
}
// 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. // 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 {