]> code.octet-stream.net Git - broadcaster/commitdiff
Fix races in status message accumulation
authorThomas Karpiniec <tom.karpiniec@outlook.com>
Sun, 20 Oct 2024 02:50:09 +0000 (13:50 +1100)
committerThomas Karpiniec <tom.karpiniec@outlook.com>
Sun, 20 Oct 2024 02:50:09 +0000 (13:50 +1100)
server/status.go

index accbcc9933de41124cebe7a0beed83b503b2cbad..260a0ce30bf9d50b9f21e3f58d4fcf63076f6644 100644 (file)
@@ -2,11 +2,13 @@ package main
 
 import (
        "code.octet-stream.net/broadcaster/protocol"
+       "sync"
 )
 
 type ServerStatus struct {
-       statuses   map[int]protocol.StatusMessage
-       changeWait chan bool
+       statuses      map[int]protocol.StatusMessage
+       statusesMutex sync.Mutex
+       changeWait    chan bool
 }
 
 var status ServerStatus
@@ -19,11 +21,15 @@ func InitServerStatus() {
 }
 
 func (s *ServerStatus) MergeStatus(radioId int, status protocol.StatusMessage) {
+       s.statusesMutex.Lock()
+       defer s.statusesMutex.Unlock()
        s.statuses[radioId] = status
        s.TriggerChange()
 }
 
 func (s *ServerStatus) RadioDisconnected(radioId int) {
+       s.statusesMutex.Lock()
+       defer s.statusesMutex.Unlock()
        delete(s.statuses, radioId)
        s.TriggerChange()
 }
@@ -34,7 +40,13 @@ func (s *ServerStatus) TriggerChange() {
 }
 
 func (s *ServerStatus) Statuses() map[int]protocol.StatusMessage {
-       return s.statuses
+       s.statusesMutex.Lock()
+       defer s.statusesMutex.Unlock()
+       c := make(map[int]protocol.StatusMessage)
+       for k, v := range s.statuses {
+               c[k] = v
+       }
+       return c
 }
 
 func (s *ServerStatus) ChangeChannel() chan bool {