From a720f90a70f3ca21ab8eacb98788aa04e7aca704 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 4 Jul 2014 15:16:33 +0200 Subject: [PATCH] Don't leak writer and index goroutines on close --- protocol/protocol.go | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/protocol/protocol.go b/protocol/protocol.go index 9977737d3..e82fa756b 100644 --- a/protocol/protocol.go +++ b/protocol/protocol.go @@ -332,11 +332,16 @@ func (c *rawConnection) indexSerializerLoop() { // large index update from the other side. But we must also ensure to // process the indexes in the order they are received, hence the separate // routine and buffered channel. - for ii := range incomingIndexes { - if ii.update { - c.receiver.IndexUpdate(ii.id, ii.repo, ii.files) - } else { - c.receiver.Index(ii.id, ii.repo, ii.files) + for { + select { + case ii := <-incomingIndexes: + if ii.update { + c.receiver.IndexUpdate(ii.id, ii.repo, ii.files) + } else { + c.receiver.Index(ii.id, ii.repo, ii.files) + } + case <-c.closed: + return } } } @@ -450,13 +455,18 @@ func (c *rawConnection) send(h header, es ...encodable) bool { func (c *rawConnection) writerLoop() { var err error - for es := range c.outbox { - for _, e := range es { - e.encodeXDR(c.xw) - } + for { + select { + case es := <-c.outbox: + for _, e := range es { + e.encodeXDR(c.xw) + } - if err = c.flush(); err != nil { - c.close(err) + if err = c.flush(); err != nil { + c.close(err) + return + } + case <-c.closed: return } }