From 5ebfc9027bc8c1114dc8b4098b223964d9ddb4e7 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 10 Jun 2015 12:22:38 +0100 Subject: [PATCH] Flush gossip inside the channel lock so we know sender hasn't been Stop()-ed --- router/gossip.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/router/gossip.go b/router/gossip.go index e119e661..81ec7f1c 100644 --- a/router/gossip.go +++ b/router/gossip.go @@ -329,22 +329,18 @@ func (c *GossipChannel) log(args ...interface{}) { // for testing func (router *Router) sendPendingGossip() { - // copy the senders so we don't hold the lock for long - var allSenders []*GossipSender for _, channel := range router.GossipChannels { channel.Lock() for _, sender := range channel.senders { - allSenders = append(allSenders, sender) + ch := make(chan struct{}) + sender.flushch <- ch + <-ch } for _, sender := range channel.broadcasters { - allSenders = append(allSenders, sender) + ch := make(chan struct{}) + sender.flushch <- ch + <-ch } channel.Unlock() } - - for _, sender := range allSenders { - ch := make(chan struct{}) - sender.flushch <- ch - <-ch - } }