From c5bc98e3e0131ef35632c2b82ac6111d67611cc9 Mon Sep 17 00:00:00 2001 From: Jimmy Hu Date: Thu, 14 Feb 2019 12:59:02 +0800 Subject: core: fix closing closed channel (#445) --- core/agreement.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/core/agreement.go b/core/agreement.go index 10ba354..b35100b 100644 --- a/core/agreement.go +++ b/core/agreement.go @@ -434,8 +434,10 @@ func (a *agreement) processVote(vote *types.Vote) error { a.hasOutput = true a.data.recv.ConfirmBlock(hash, a.data.votes[vote.Period][vote.Type]) - close(a.doneChan) - a.doneChan = nil + if a.doneChan != nil { + close(a.doneChan) + a.doneChan = nil + } } return nil } @@ -468,7 +470,10 @@ func (a *agreement) processVote(vote *types.Vote) error { a.data.lockIter = vote.Period } a.fastForward <- vote.Period - close(a.doneChan) + if a.doneChan != nil { + close(a.doneChan) + a.doneChan = nil + } return nil } } @@ -494,7 +499,10 @@ func (a *agreement) processVote(vote *types.Vote) error { a.data.recv.PullBlocks(hashes) } a.fastForward <- vote.Period + 1 - close(a.doneChan) + if a.doneChan != nil { + close(a.doneChan) + a.doneChan = nil + } return nil } return nil @@ -503,13 +511,10 @@ func (a *agreement) processVote(vote *types.Vote) error { func (a *agreement) done() <-chan struct{} { a.lock.Lock() defer a.lock.Unlock() - if a.doneChan == nil { - return closedchan - } - a.data.lock.Lock() - defer a.data.lock.Unlock() select { case period := <-a.fastForward: + a.data.lock.Lock() + defer a.data.lock.Unlock() if period <= a.data.period { break } @@ -519,6 +524,9 @@ func (a *agreement) done() <-chan struct{} { return closedchan default: } + if a.doneChan == nil { + return closedchan + } return a.doneChan } -- cgit v1.2.3