Files
steamcache2/steamcache/avgcachestate/avgcachestate.go

71 lines
1.3 KiB
Go

package avgcachestate
import (
"s1d3sw1ped/SteamCache2/vfs/cachestate"
"sync"
)
// AvgCacheState is a cache state that averages the last N cache states.
type AvgCacheState struct {
size int
hits int
misses int
avgs []cachestate.CacheState
mu sync.Mutex
}
// New creates a new average cache state with the given size.
func New(size int) *AvgCacheState {
a := &AvgCacheState{
size: size,
avgs: make([]cachestate.CacheState, size),
mu: sync.Mutex{},
}
a.Clear()
return a
}
// Clear resets the average cache state to zero.
func (a *AvgCacheState) Clear() {
a.mu.Lock()
defer a.mu.Unlock()
for i := 0; i < len(a.avgs); i++ {
a.avgs[i] = cachestate.CacheStateMiss
}
}
// Add adds a cache state to the average cache state.
func (a *AvgCacheState) Add(cs cachestate.CacheState) {
a.mu.Lock()
defer a.mu.Unlock()
a.avgs = append(a.avgs, cs)
if len(a.avgs) > a.size {
switch a.avgs[0] {
case cachestate.CacheStateHit:
a.hits--
case cachestate.CacheStateMiss:
a.misses--
}
a.avgs = a.avgs[1:]
}
switch cs {
case cachestate.CacheStateHit:
a.hits++
case cachestate.CacheStateMiss:
a.misses++
}
}
// Avg returns the average cache state.
func (a *AvgCacheState) Avg() float64 {
a.mu.Lock()
defer a.mu.Unlock()
return float64(a.hits) / (float64(a.misses) + 0.0000001)
}