This commit is contained in:
@@ -87,6 +87,8 @@ func (p *Publisher) Publish(devices ...models.Device) {
|
||||
return
|
||||
}
|
||||
|
||||
unwaitMap := make(map[int]bool)
|
||||
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
|
||||
@@ -106,10 +108,14 @@ func (p *Publisher) Publish(devices ...models.Device) {
|
||||
}
|
||||
} else {
|
||||
p.pending[device.BridgeID] = append(p.pending[device.BridgeID], device)
|
||||
if p.waiting[device.BridgeID] != nil {
|
||||
close(p.waiting[device.BridgeID])
|
||||
p.waiting[device.BridgeID] = nil
|
||||
}
|
||||
unwaitMap[device.BridgeID] = true
|
||||
}
|
||||
}
|
||||
|
||||
for bridgeID := range unwaitMap {
|
||||
if p.waiting[bridgeID] != nil {
|
||||
close(p.waiting[bridgeID])
|
||||
p.waiting[bridgeID] = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -124,11 +130,16 @@ func (p *Publisher) Run() {
|
||||
ticker := time.NewTicker(time.Millisecond * 100)
|
||||
deleteList := make([]int, 0, 8)
|
||||
updatedList := make([]models.Device, 0, 16)
|
||||
unwaitMap := make(map[int]bool)
|
||||
|
||||
for range ticker.C {
|
||||
deleteList = deleteList[:0]
|
||||
updatedList = updatedList[:0]
|
||||
|
||||
for key := range unwaitMap {
|
||||
delete(unwaitMap, key)
|
||||
}
|
||||
|
||||
p.mu.Lock()
|
||||
for i, scene := range p.scenes {
|
||||
if (!scene.endTime.IsZero() && time.Now().After(scene.endTime)) || scene.Empty() {
|
||||
@@ -160,9 +171,13 @@ func (p *Publisher) Run() {
|
||||
}
|
||||
|
||||
p.pending[device.BridgeID] = append(p.pending[device.BridgeID], device)
|
||||
if p.waiting[device.BridgeID] != nil {
|
||||
close(p.waiting[device.BridgeID])
|
||||
p.waiting[device.BridgeID] = nil
|
||||
unwaitMap[device.BridgeID] = true
|
||||
}
|
||||
|
||||
for bridgeID := range unwaitMap {
|
||||
if p.waiting[bridgeID] != nil {
|
||||
close(p.waiting[bridgeID])
|
||||
p.waiting[bridgeID] = nil
|
||||
}
|
||||
}
|
||||
p.mu.Unlock()
|
||||
@@ -270,8 +285,8 @@ func (p *Publisher) runBridge(id int) {
|
||||
p.mu.Lock()
|
||||
}
|
||||
|
||||
updates := p.pending[id]
|
||||
p.pending[id] = p.pending[id][:0:0]
|
||||
updates := append(p.pending[id][:0:0], p.pending[id]...)
|
||||
p.pending[id] = p.pending[id][:0]
|
||||
p.mu.Unlock()
|
||||
|
||||
// Only allow the latest update per device (this avoids slow bridges causing a backlog of cations).
|
||||
|
||||
Reference in New Issue
Block a user