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:
parent
1682362779
commit
d94c029fda
@ -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})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user