mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 10:41:03 +01:00
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
|
package context
|
||
|
|
||
|
import (
|
||
|
"math"
|
||
|
"sync/atomic"
|
||
|
)
|
||
|
|
||
|
// Counter is the shared counter instances between Iris applications of the same process.
|
||
|
var Counter = NewGlobalCounter() // it's not used anywhere, currently but it's here.
|
||
|
|
||
|
// NewGlobalCounter returns a fresh instance of a global counter.
|
||
|
// End developers can use it as a helper for their applications.
|
||
|
func NewGlobalCounter() *GlobalCounter {
|
||
|
return &GlobalCounter{Max: math.MaxUint64}
|
||
|
}
|
||
|
|
||
|
// GlobalCounter is a counter which
|
||
|
// atomically increments until Max.
|
||
|
type GlobalCounter struct {
|
||
|
value uint64
|
||
|
Max uint64
|
||
|
}
|
||
|
|
||
|
// Increment increments the Value.
|
||
|
// The value cannot exceed the Max one.
|
||
|
// It uses Compare and Swap with the atomic package.
|
||
|
//
|
||
|
// Returns the new number value.
|
||
|
func (c *GlobalCounter) Increment() (newValue uint64) {
|
||
|
for {
|
||
|
prev := atomic.LoadUint64(&c.value)
|
||
|
newValue = prev + 1
|
||
|
|
||
|
if newValue >= c.Max {
|
||
|
newValue = 0
|
||
|
}
|
||
|
|
||
|
if atomic.CompareAndSwapUint64(&c.value, prev, newValue) {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Get returns the current counter without incrementing.
|
||
|
func (c *GlobalCounter) Get() uint64 {
|
||
|
return atomic.LoadUint64(&c.value)
|
||
|
}
|