1
0

Added a mutex for Listeners struct for thread safety.

This commit is contained in:
Alexander Andreev 2023-10-01 04:18:43 +04:00
parent 5a058aa706
commit cbfc1549ed
Signed by: Arav
GPG Key ID: D22A817D95815393

View File

@ -4,10 +4,12 @@ import (
"errors" "errors"
"fmt" "fmt"
"math" "math"
"sync"
) )
// Listeners stores the current and peak numbers of listeners. // Listeners stores the current and peak numbers of listeners.
type Listeners struct { type Listeners struct {
mut sync.Mutex
current, peak int current, peak int
} }
@ -18,16 +20,22 @@ func NewListeners() *Listeners {
// Current returns a number of current listeners. // Current returns a number of current listeners.
func (l *Listeners) Current() int { func (l *Listeners) Current() int {
l.mut.Lock()
defer l.mut.Unlock()
return l.current return l.current
} }
// Current returns a number of peak listeners. // Current returns a number of peak listeners.
func (l *Listeners) Peak() int { func (l *Listeners) Peak() int {
l.mut.Lock()
defer l.mut.Unlock()
return l.peak return l.peak
} }
// Inc increments by 1 a current number of listeners and updates a peak number. // Inc increments by 1 a current number of listeners and updates a peak number.
func (l *Listeners) Inc() int { func (l *Listeners) Inc() int {
l.mut.Lock()
defer l.mut.Unlock()
if l.current == math.MaxInt { if l.current == math.MaxInt {
// 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 MaxInt which is", math.MaxInt)) panic(fmt.Sprint("a current number of listeners exceeded MaxInt which is", math.MaxInt))
@ -42,6 +50,8 @@ func (l *Listeners) Inc() int {
// Dec decrements by 1 a current number of listeners. An error will occur if // Dec decrements by 1 a current number of listeners. An error will occur if
// a resulting number is less than 0. // a resulting number is less than 0.
func (l *Listeners) Dec() (int, error) { func (l *Listeners) Dec() (int, error) {
l.mut.Lock()
defer l.mut.Unlock()
if l.current == 0 { if l.current == 0 {
return l.current, errors.New("an attempt to decrement a number of current listeners down to less than 0") return l.current, errors.New("an attempt to decrement a number of current listeners down to less than 0")
} }