diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2019-02-14 12:59:02 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-14 12:59:02 +0800 |
commit | c5bc98e3e0131ef35632c2b82ac6111d67611cc9 (patch) | |
tree | e9e7b15e5713d53fc808e98f2365126b7bbe67d2 | |
parent | 33955365a764647b4e95eb8236eb9d54e7ceba12 (diff) | |
download | tangerine-consensus-c5bc98e3e0131ef35632c2b82ac6111d67611cc9.tar.gz tangerine-consensus-c5bc98e3e0131ef35632c2b82ac6111d67611cc9.tar.zst tangerine-consensus-c5bc98e3e0131ef35632c2b82ac6111d67611cc9.zip |
core: fix closing closed channel (#445)
-rw-r--r-- | core/agreement.go | 26 |
1 files 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 } |