diff --git a/daemon/broadcast.c b/daemon/broadcast.c index e9b03d3b3..be530ffa3 100644 --- a/daemon/broadcast.c +++ b/daemon/broadcast.c @@ -26,9 +26,21 @@ void queue_broadcast(struct broadcast_state *bstate, const u8 *tag, const u8 *payload) { - struct queued_message *msg = new_queued_message(bstate, type, tag, payload); + struct queued_message *msg; + u64 index = 0; + /* Remove any tag&type collisions */ + while (true) { + msg = next_broadcast_message(bstate, &index); + if (msg == NULL) + break; + else if (msg->type == type && memcmp(msg->tag, tag, tal_count(tag)) == 0) { + uintmap_del(&bstate->broadcasts, index); + tal_free(msg); + } + } - /*FIXME(cdecker) Walk through old messages and purge collisions */ + /* Now add the message to the queue */ + msg = new_queued_message(bstate, type, tag, payload); uintmap_add(&bstate->broadcasts, bstate->next_index, msg); bstate->next_index += 1; } diff --git a/daemon/broadcast.h b/daemon/broadcast.h index ebc28da07..5c002fdc1 100644 --- a/daemon/broadcast.h +++ b/daemon/broadcast.h @@ -26,6 +26,10 @@ UINTMAP(struct queued_message *) broadcasts; struct broadcast_state *new_broadcast_state(tal_t *ctx); +/* Queue a new message to be broadcast and replace any outdated + * broadcast. Replacement is done by comparing the `type` and the + * `tag`, if both match the old message is dropped from the queue. The + * new message is added to the top of the broadcast queue. */ void queue_broadcast(struct broadcast_state *bstate, const int type, const u8 *tag,