2
2
mirror of https://github.com/octoleo/restic.git synced 2024-06-01 08:30:49 +00:00

ui/progress: Use mutex instead of atomic

The counter value needs to be aligned to 64 bit in memory for the
atomic functions to work on some platform (such as 32 bit ARM).

The atomic package says in its documentation:

> These functions require great care to be used correctly. Except for
> special, low-level applications, synchronization is better done with
> channels or the facilities of the sync package.

This commit replaces the atomic functions with a simple sync.Mutex, so
we don't have to care about alignment.
This commit is contained in:
Alexander Neumann 2020-12-22 21:03:27 +01:00
parent f7c7c2f730
commit 6c514adb8a

View File

@ -3,7 +3,6 @@ package progress
import (
"os"
"sync"
"sync/atomic"
"time"
"github.com/restic/restic/internal/debug"
@ -25,7 +24,9 @@ type Counter struct {
stopped chan struct{} // Closed by run.
stop chan struct{} // Close to stop run.
tick *time.Ticker
value uint64
valueMutex sync.Mutex
value uint64
}
// New starts a new Counter.
@ -52,7 +53,10 @@ func (c *Counter) Add(v uint64) {
if c == nil {
return
}
atomic.AddUint64(&c.value, v)
c.valueMutex.Lock()
c.value += v
c.valueMutex.Unlock()
}
// Done tells a Counter to stop and waits for it to report its final value.
@ -66,7 +70,13 @@ func (c *Counter) Done() {
*c = Counter{} // Prevent reuse.
}
func (c *Counter) get() uint64 { return atomic.LoadUint64(&c.value) }
func (c *Counter) get() uint64 {
c.valueMutex.Lock()
v := c.value
c.valueMutex.Unlock()
return v
}
func (c *Counter) run() {
defer close(c.stopped)