fixed concurrent map write

* protect map access with mutex to avoid concurrent map access

see #493
This commit is contained in:
Bernhard B
2024-02-28 16:37:40 +01:00
parent d897ac3485
commit 91d7dc0a19

View File

@@ -6,6 +6,7 @@ import (
"errors" "errors"
"net" "net"
"time" "time"
"sync"
"github.com/bbernhard/signal-cli-rest-api/utils" "github.com/bbernhard/signal-cli-rest-api/utils"
uuid "github.com/gofrs/uuid" uuid "github.com/gofrs/uuid"
@@ -37,6 +38,7 @@ type JsonRpc2Client struct {
lastTimeErrorMessageSent time.Time lastTimeErrorMessageSent time.Time
signalCliApiConfig *utils.SignalCliApiConfig signalCliApiConfig *utils.SignalCliApiConfig
number string number string
receivedMessagesMutex sync.Mutex
} }
func NewJsonRpc2Client(signalCliApiConfig *utils.SignalCliApiConfig, number string) *JsonRpc2Client { func NewJsonRpc2Client(signalCliApiConfig *utils.SignalCliApiConfig, number string) *JsonRpc2Client {
@@ -139,9 +141,12 @@ func (r *JsonRpc2Client) ReceiveData(number string) {
} }
//log.Info("Received data = ", str) //log.Info("Received data = ", str)
var resp1 JsonRpc2ReceivedMessage var resp1 JsonRpc2ReceivedMessage
json.Unmarshal([]byte(str), &resp1) json.Unmarshal([]byte(str), &resp1)
if resp1.Method == "receive" { if resp1.Method == "receive" {
r.receivedMessagesMutex.Lock()
for _, c := range r.receivedMessagesChannels { for _, c := range r.receivedMessagesChannels {
select { select {
case c <- resp1: case c <- resp1:
@@ -151,6 +156,7 @@ func (r *JsonRpc2Client) ReceiveData(number string) {
} }
continue continue
} }
r.receivedMessagesMutex.Unlock()
} }
var resp2 JsonRpc2MessageResponse var resp2 JsonRpc2MessageResponse
@@ -175,11 +181,15 @@ func (r *JsonRpc2Client) GetReceiveChannel() (chan JsonRpc2ReceivedMessage, stri
return c, "", err return c, "", err
} }
r.receivedMessagesMutex.Lock()
defer r.receivedMessagesMutex.Unlock()
r.receivedMessagesChannels[channelUuid.String()] = c r.receivedMessagesChannels[channelUuid.String()] = c
return c, channelUuid.String(), nil return c, channelUuid.String(), nil
} }
func (r *JsonRpc2Client) RemoveReceiveChannel(channelUuid string) { func (r *JsonRpc2Client) RemoveReceiveChannel(channelUuid string) {
r.receivedMessagesMutex.Lock()
defer r.receivedMessagesMutex.Unlock()
delete(r.receivedMessagesChannels, channelUuid) delete(r.receivedMessagesChannels, channelUuid)
} }