diff --git a/cmd/syncthing/blockqueue.go b/cmd/syncthing/blockqueue.go index 674946880..b13ac980b 100644 --- a/cmd/syncthing/blockqueue.go +++ b/cmd/syncthing/blockqueue.go @@ -1,6 +1,10 @@ package main -import "github.com/calmh/syncthing/scanner" +import ( + "sync/atomic" + + "github.com/calmh/syncthing/scanner" +) type bqAdd struct { file scanner.File @@ -20,6 +24,7 @@ type blockQueue struct { outbox chan bqBlock queued []bqBlock + qlen uint32 } func newBlockQueue() *blockQueue { @@ -77,6 +82,7 @@ func (q *blockQueue) run() { q.queued = q.queued[1:] } } + atomic.StoreUint32(&q.qlen, uint32(len(q.queued))) } } @@ -89,6 +95,7 @@ func (q *blockQueue) get() bqBlock { } func (q *blockQueue) empty() bool { - // There is a race condition here. We're only mostly sure the queue is empty if the expression below is true. - return len(q.queued) == 0 && len(q.inbox) == 0 && len(q.outbox) == 0 + var l uint32 + atomic.LoadUint32(&l) + return l == 0 } diff --git a/files/set.go b/files/set.go index 4f3e71e80..88b132344 100644 --- a/files/set.go +++ b/files/set.go @@ -108,8 +108,8 @@ func (m *Set) Need(id uint) []scanner.File { if debug { dlog.Printf("Need(%d)", id) } - var fs = make([]scanner.File, 0, len(m.globalKey)/2) // Just a guess, but avoids too many reallocations m.Lock() + var fs = make([]scanner.File, 0, len(m.globalKey)/2) // Just a guess, but avoids too many reallocations rkID := m.remoteKey[id] for gk, gf := range m.files { if !gf.Global { @@ -145,8 +145,8 @@ func (m *Set) Global() []scanner.File { if debug { dlog.Printf("Global()") } - var fs = make([]scanner.File, 0, len(m.globalKey)) m.Lock() + var fs = make([]scanner.File, 0, len(m.globalKey)) for _, file := range m.files { if file.Global { fs = append(fs, file.File)