fixed fetcher semaphores

This commit is contained in:
zsfelfoldi 2016-06-29 02:43:36 +02:00
parent 947d696210
commit 8c3701c7c5

View file

@ -20,6 +20,7 @@ package les
import (
"fmt"
"sync"
"sync/atomic"
"time"
"github.com/ethereum/go-ethereum/core"
@ -35,6 +36,7 @@ type lightFetcher struct{
syncPoolMu sync.Mutex
syncPool map[*peer]struct{}
syncPoolNotify chan struct{}
syncPoolNotified uint32
}
func newLightFetcher(pm *ProtocolManager) *lightFetcher {
@ -85,8 +87,10 @@ func (f *lightFetcher) notify(p *peer, block blockInfo) {
f.syncPoolMu.Lock()
f.syncPool[p] = struct{}{}
f.syncPoolMu.Unlock()
if atomic.SwapUint32(&f.syncPoolNotified, 1) == 0 {
f.syncPoolNotify <- struct{}{}
}
}
}
func (f *lightFetcher) fetchBestFromPool() *peer {
@ -113,20 +117,27 @@ func (f *lightFetcher) fetchBestFromPool() *peer {
}
func (f *lightFetcher) syncLoop() {
f.pm.wg.Add(1)
defer f.pm.wg.Done()
for {
select {
case <-f.pm.quitSync:
return
case <-f.syncPoolNotify:
atomic.StoreUint32(&f.syncPoolNotified, 0)
chn := f.pm.getSyncLock(false)
if chn != nil {
if atomic.SwapUint32(&f.syncPoolNotified, 1) == 0 {
go func() {
<-chn
f.syncPoolNotify <- struct{}{}
}()
}
} else {
if p := f.fetchBestFromPool(); p != nil {
go f.syncWithPeer(p)
if atomic.SwapUint32(&f.syncPoolNotified, 1) == 0 {
go func() {
time.Sleep(softRequestTimeout)
f.syncPoolNotify <- struct{}{}
@ -135,6 +146,7 @@ func (f *lightFetcher) syncLoop() {
}
}
}
}
}
func (f *lightFetcher) syncWithPeer(p *peer) bool {