use locks around client maps (#126)

Co-authored-by: Luca Moser <moser.luca@gmail.com>
This commit is contained in:
muXxerandLuca Moser authored and GitHub committed 2021-08-10 10:46:38 +08:00
1 parent c75ef2d6aa
commit 1d6979189a
2 files changed
+106 -66

No files matched your search

+18 -14
View File
@@ -549,13 +549,19 @@ func (b *Broker) SendLocalSubsToRouter(c *client) {
subInfo := packets.NewControlPacket(packets.Subscribe).(*packets.SubscribePacket)
b.clients.Range(func(key, value interface{}) bool {
client, ok := value.(*client)
if ok {
subs := client.subMap
for _, sub := range subs {
subInfo.Topics = append(subInfo.Topics, sub.topic)
subInfo.Qoss = append(subInfo.Qoss, sub.qos)
}
if !ok {
return true
}
client.subMapMu.RLock()
defer client.subMapMu.RUnlock()
subs := client.subMap
for _, sub := range subs {
subInfo.Topics = append(subInfo.Topics, sub.topic)
subInfo.Qoss = append(subInfo.Qoss, sub.qos)
}
return true
})
if len(subInfo.Topics) > 0 {
@@ -629,16 +635,14 @@ func (b *Broker) PublishMessage(packet *packets.PublishPacket) {
}
}
func (b *Broker) BroadcastUnSubscribe(subs map[string]*subscription) {
func (b *Broker) BroadcastUnSubscribe(topicsToUnSubscribeFrom []string) {
if len(topicsToUnSubscribeFrom) == 0 {
return
}
unsub := packets.NewControlPacket(packets.Unsubscribe).(*packets.UnsubscribePacket)
for topic, _ := range subs {
unsub.Topics = append(unsub.Topics, topic)
}
if len(unsub.Topics) > 0 {
b.BroadcastSubOrUnsubMessage(unsub)
}
unsub.Topics = append(unsub.Topics, topicsToUnSubscribeFrom...)
b.BroadcastSubOrUnsubMessage(unsub)
}
func (b *Broker) OnlineOfflineNotification(clientID string, online bool) {