dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

ratecounter.go (712B)


      1 package ratecounter
      2 
      3 import (
      4 	"sync/atomic"
      5 	"time"
      6 )
      7 
      8 type RateCounter struct {
      9 	currTime int64
     10 	prevTime int64
     11 	curr     int64
     12 	prev     int64
     13 }
     14 
     15 func NewRateCounter() *RateCounter {
     16 	return &RateCounter{}
     17 }
     18 
     19 func (r *RateCounter) Incr() {
     20 	now := time.Now().Unix()
     21 	currTime := atomic.LoadInt64(&r.currTime)
     22 	if currTime == now {
     23 		atomic.AddInt64(&r.curr, 1)
     24 		return
     25 	}
     26 	curr := atomic.LoadInt64(&r.curr)
     27 	atomic.StoreInt64(&r.prevTime, currTime)
     28 	atomic.StoreInt64(&r.prev, curr)
     29 	atomic.StoreInt64(&r.curr, 1)
     30 	atomic.StoreInt64(&r.currTime, now)
     31 }
     32 
     33 func (r *RateCounter) Rate() int64 {
     34 	n := time.Now().Unix()
     35 	if atomic.LoadInt64(&r.prevTime) == n-1 {
     36 		return atomic.LoadInt64(&r.prev)
     37 	}
     38 	return 0
     39 }