1
0

In ListenerCounter struct also keep track of overall number of listeners for a song and its max simultaneous number of listeners. These parameters are being reset with a Reset() method that returns its values.

This commit is contained in:
Alexander Andreev 2024-05-11 04:21:00 +04:00
parent 1682362779
commit d94c029fda
Signed by: Arav
GPG Key ID: 25969B23DCB5CA34

View File

@ -3,15 +3,15 @@ package radio
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"math" "math"
"sync" "sync"
) )
// ListenerCounter stores the current and peak numbers of listeners. // ListenerCounter stores the current, overall and peak numbers of listeners.
type ListenerCounter struct { type ListenerCounter struct {
mutex sync.RWMutex mutex sync.RWMutex
current, peak int64 current, peak int64
overall, cur_peak int64
} }
// NewListenerCounter returns a new ListenerCounter struct instance. // NewListenerCounter returns a new ListenerCounter struct instance.
@ -39,12 +39,19 @@ func (l *ListenerCounter) Inc() int64 {
defer l.mutex.Unlock() defer l.mutex.Unlock()
if l.current == math.MaxInt64 { if l.current == math.MaxInt64 {
// We panic here because if this will ever happen, then something's going certainly wrong. // We panic here because if this will ever happen, then something's going certainly wrong.
panic(fmt.Sprint("a current number of listeners exceeded MaxInt64 which is", math.MaxInt)) panic("a current number of listeners exceeded MaxInt64")
} }
l.current++ l.current++
if l.current > l.peak { if l.current > l.peak {
l.peak = l.current l.peak = l.current
} }
if l.current > l.cur_peak {
l.cur_peak = l.current
}
if l.overall == math.MaxInt64 {
panic("an overall number of listeners exceeded MaxInt64")
}
l.overall++
return l.current return l.current
} }
@ -60,13 +67,27 @@ func (l *ListenerCounter) Dec() (int64, error) {
return l.current, nil return l.current, nil
} }
// Reset current peak and overall listeners for a song that is playing.
// And return its values.
func (l *ListenerCounter) Reset() (overall, peak int64) {
l.mutex.Lock()
defer l.mutex.Unlock()
peak = l.cur_peak
l.cur_peak = l.current
overall = l.overall
l.overall = l.current
return
}
func (l *ListenerCounter) MarshalJSON() ([]byte, error) { func (l *ListenerCounter) MarshalJSON() ([]byte, error) {
l.mutex.RLock() l.mutex.RLock()
defer l.mutex.RUnlock() defer l.mutex.RUnlock()
return json.Marshal(&struct { return json.Marshal(&struct {
Current int64 `json:"current"` Current int64 `json:"current"`
Peak int64 `json:"peak"` Peak int64 `json:"peak"`
Overall int64 `json:"overall"`
}{ }{
Current: l.current, Current: l.current,
Peak: l.peak}) Peak: l.peak,
Overall: l.overall})
} }