eth: fix data race accessing peer.td

This commit is contained in:
Péter Szilágyi
2015-06-09 14:56:27 +03:00
parent 44147d057d
commit f86707713c
3 changed files with 33 additions and 14 deletions

View File

@ -41,10 +41,10 @@ type peer struct {
protv, netid int
id string
td *big.Int
head common.Hash
headLock sync.RWMutex
head common.Hash
td *big.Int
lock sync.RWMutex
genesis, ourHash common.Hash
ourTd *big.Int
@ -72,8 +72,8 @@ func newPeer(protv, netid int, genesis, head common.Hash, td *big.Int, p *p2p.Pe
// Head retrieves a copy of the current head (most recent) hash of the peer.
func (p *peer) Head() (hash common.Hash) {
p.headLock.RLock()
defer p.headLock.RUnlock()
p.lock.RLock()
defer p.lock.RUnlock()
copy(hash[:], p.head[:])
return hash
@ -81,12 +81,28 @@ func (p *peer) Head() (hash common.Hash) {
// SetHead updates the head (most recent) hash of the peer.
func (p *peer) SetHead(hash common.Hash) {
p.headLock.Lock()
defer p.headLock.Unlock()
p.lock.Lock()
defer p.lock.Unlock()
copy(p.head[:], hash[:])
}
// Td retrieves the current total difficulty of a peer.
func (p *peer) Td() *big.Int {
p.lock.RLock()
defer p.lock.RUnlock()
return new(big.Int).Set(p.td)
}
// SetTd updates the current total difficulty of a peer.
func (p *peer) SetTd(td *big.Int) {
p.lock.Lock()
defer p.lock.Unlock()
p.td.Set(td)
}
// sendTransactions sends transactions to the peer and includes the hashes
// in it's tx hash set for future reference. The tx hash will allow the
// manager to check whether the peer has already received this particular
@ -275,11 +291,14 @@ func (ps *peerSet) BestPeer() *peer {
ps.lock.RLock()
defer ps.lock.RUnlock()
var best *peer
var (
bestPeer *peer
bestTd *big.Int
)
for _, p := range ps.peers {
if best == nil || p.td.Cmp(best.td) > 0 {
best = p
if td := p.Td(); bestPeer == nil || td.Cmp(bestTd) > 0 {
bestPeer, bestTd = p, td
}
}
return best
return bestPeer
}