Avoid unaligned atomic access on 32 bit platforms

Closes #23
This commit is contained in:
Andrew Ayer 2017-11-06 13:33:02 -08:00
parent a26bf3e300
commit 41ca1aaab8
1 changed files with 5 additions and 8 deletions

View File

@ -69,9 +69,6 @@ type Scanner struct {
// Configuration options for this Scanner instance // Configuration options for this Scanner instance
opts ScannerOptions opts ScannerOptions
// Stats
certsProcessed int64
} }
// fetchRange represents a range of certs to fetch from a CT log // fetchRange represents a range of certs to fetch from a CT log
@ -83,9 +80,9 @@ type fetchRange struct {
// Worker function to process certs. // Worker function to process certs.
// Accepts ct.LogEntries over the |entries| channel, and invokes processCert on them. // Accepts ct.LogEntries over the |entries| channel, and invokes processCert on them.
// Returns true over the |done| channel when the |entries| channel is closed. // Returns true over the |done| channel when the |entries| channel is closed.
func (s *Scanner) processerJob(id int, entries <-chan ct.LogEntry, processCert ProcessCallback, wg *sync.WaitGroup) { func (s *Scanner) processerJob(id int, certsProcessed *int64, entries <-chan ct.LogEntry, processCert ProcessCallback, wg *sync.WaitGroup) {
for entry := range entries { for entry := range entries {
atomic.AddInt64(&s.certsProcessed, 1) atomic.AddInt64(certsProcessed, 1)
processCert(s, &entry) processCert(s, &entry)
} }
wg.Done() wg.Done()
@ -273,7 +270,7 @@ func (s *Scanner) MakeCollapsedMerkleTree(sth *ct.SignedTreeHead) (*CollapsedMer
func (s *Scanner) Scan(startIndex int64, endIndex int64, processCert ProcessCallback, tree *CollapsedMerkleTree) error { func (s *Scanner) Scan(startIndex int64, endIndex int64, processCert ProcessCallback, tree *CollapsedMerkleTree) error {
s.Log("Starting scan...") s.Log("Starting scan...")
s.certsProcessed = 0 certsProcessed := new(int64)
startTime := time.Now() startTime := time.Now()
/* TODO: only launch ticker goroutine if in verbose mode; kill the goroutine when the scanner finishes /* TODO: only launch ticker goroutine if in verbose mode; kill the goroutine when the scanner finishes
ticker := time.NewTicker(time.Second) ticker := time.NewTicker(time.Second)
@ -294,7 +291,7 @@ func (s *Scanner) Scan(startIndex int64, endIndex int64, processCert ProcessCall
var processorWG sync.WaitGroup var processorWG sync.WaitGroup
for w := 0; w < s.opts.NumWorkers; w++ { for w := 0; w < s.opts.NumWorkers; w++ {
processorWG.Add(1) processorWG.Add(1)
go s.processerJob(w, jobs, processCert, &processorWG) go s.processerJob(w, certsProcessed, jobs, processCert, &processorWG)
} }
for start := startIndex; start < int64(endIndex); { for start := startIndex; start < int64(endIndex); {
@ -306,7 +303,7 @@ func (s *Scanner) Scan(startIndex int64, endIndex int64, processCert ProcessCall
} }
close(jobs) close(jobs)
processorWG.Wait() processorWG.Wait()
s.Log(fmt.Sprintf("Completed %d certs in %s", s.certsProcessed, humanTime(int(time.Since(startTime).Seconds())))) s.Log(fmt.Sprintf("Completed %d certs in %s", *certsProcessed, humanTime(int(time.Since(startTime).Seconds()))))
return nil return nil
} }