|
@@ -25,6 +25,7 @@ package atomic
|
|
|
import (
|
|
import (
|
|
|
"math"
|
|
"math"
|
|
|
"sync/atomic"
|
|
"sync/atomic"
|
|
|
|
|
+ "time"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// Int32 is an atomic wrapper around an int32.
|
|
// Int32 is an atomic wrapper around an int32.
|
|
@@ -304,6 +305,47 @@ func (f *Float64) CAS(old, new float64) bool {
|
|
|
return atomic.CompareAndSwapUint64(&f.v, math.Float64bits(old), math.Float64bits(new))
|
|
return atomic.CompareAndSwapUint64(&f.v, math.Float64bits(old), math.Float64bits(new))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// Duration is an atomic wrapper around time.Duration
|
|
|
|
|
+// https://godoc.org/time#Duration
|
|
|
|
|
+type Duration struct {
|
|
|
|
|
+ v Int64
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// NewDuration creates a Duration.
|
|
|
|
|
+func NewDuration(d time.Duration) *Duration {
|
|
|
|
|
+ return &Duration{v: *NewInt64(int64(d))}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Load atomically loads the wrapped value.
|
|
|
|
|
+func (d *Duration) Load() time.Duration {
|
|
|
|
|
+ return time.Duration(d.v.Load())
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Store atomically stores the passed value.
|
|
|
|
|
+func (d *Duration) Store(n time.Duration) {
|
|
|
|
|
+ d.v.Store(int64(n))
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Add atomically adds to the wrapped time.Duration and returns the new value.
|
|
|
|
|
+func (d *Duration) Add(n time.Duration) time.Duration {
|
|
|
|
|
+ return time.Duration(d.v.Add(int64(n)))
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Sub atomically subtracts from the wrapped time.Duration and returns the new value.
|
|
|
|
|
+func (d *Duration) Sub(n time.Duration) time.Duration {
|
|
|
|
|
+ return time.Duration(d.v.Sub(int64(n)))
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Swap atomically swaps the wrapped time.Duration and returns the old value.
|
|
|
|
|
+func (d *Duration) Swap(n time.Duration) time.Duration {
|
|
|
|
|
+ return time.Duration(d.v.Swap(int64(n)))
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// CAS is an atomic compare-and-swap.
|
|
|
|
|
+func (d *Duration) CAS(old, new time.Duration) bool {
|
|
|
|
|
+ return d.v.CAS(int64(old), int64(new))
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// Value shadows the type of the same name from sync/atomic
|
|
// Value shadows the type of the same name from sync/atomic
|
|
|
// https://godoc.org/sync/atomic#Value
|
|
// https://godoc.org/sync/atomic#Value
|
|
|
type Value struct{ atomic.Value }
|
|
type Value struct{ atomic.Value }
|