From d94c029fdaac63bd4e39ff7a6764b840eb4affea Mon Sep 17 00:00:00 2001 From: "Alexander \"Arav\" Andreev" Date: Sat, 11 May 2024 04:21:00 +0400 Subject: [PATCH] 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. --- internal/radio/listener_counter.go | 33 ++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/internal/radio/listener_counter.go b/internal/radio/listener_counter.go index dbf51d2..c423ef8 100644 --- a/internal/radio/listener_counter.go +++ b/internal/radio/listener_counter.go @@ -3,15 +3,15 @@ package radio import ( "encoding/json" "errors" - "fmt" "math" "sync" ) -// ListenerCounter stores the current and peak numbers of listeners. +// ListenerCounter stores the current, overall and peak numbers of listeners. type ListenerCounter struct { - mutex sync.RWMutex - current, peak int64 + mutex sync.RWMutex + current, peak int64 + overall, cur_peak int64 } // NewListenerCounter returns a new ListenerCounter struct instance. @@ -39,12 +39,19 @@ func (l *ListenerCounter) Inc() int64 { defer l.mutex.Unlock() if l.current == math.MaxInt64 { // 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++ if l.current > l.peak { 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 } @@ -60,13 +67,27 @@ func (l *ListenerCounter) Dec() (int64, error) { 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) { l.mutex.RLock() defer l.mutex.RUnlock() return json.Marshal(&struct { Current int64 `json:"current"` Peak int64 `json:"peak"` + Overall int64 `json:"overall"` }{ Current: l.current, - Peak: l.peak}) + Peak: l.peak, + Overall: l.overall}) }