From: Matt Joiner Date: Sun, 24 Aug 2014 19:24:18 +0000 (+1000) Subject: Let client.DataWaiter have its own mutex X-Git-Tag: v1.0.0~1604 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=0b01c597c0c913f266263373d0116e0cb7761276;p=btrtrc.git Let client.DataWaiter have its own mutex --- diff --git a/client.go b/client.go index 1f8cf724..0999d6da 100644 --- a/client.go +++ b/client.go @@ -104,9 +104,11 @@ type Client struct { event sync.Cond quit chan struct{} - halfOpen int - torrents map[InfoHash]*torrent - dataWaiter chan struct{} + halfOpen int + torrents map[InfoHash]*torrent + + dataWaiterMutex sync.Mutex + dataWaiter chan struct{} } func (me *Client) ListenAddr() net.Addr { @@ -1261,21 +1263,24 @@ func (me *Client) downloadedChunk(t *torrent, c *connection, msg *pp.Message) er } func (cl *Client) dataReady(ds dataSpec) { + cl.dataWaiterMutex.Lock() if cl.dataWaiter != nil { close(cl.dataWaiter) } cl.dataWaiter = nil + cl.dataWaiterMutex.Unlock() } // Returns a channel that is closed when new data has become available in the // client. -func (me *Client) DataWaiter() <-chan struct{} { - me.mu.Lock() - defer me.mu.Unlock() +func (me *Client) DataWaiter() (ret <-chan struct{}) { + me.dataWaiterMutex.Lock() if me.dataWaiter == nil { me.dataWaiter = make(chan struct{}) } - return me.dataWaiter + ret = me.dataWaiter + me.dataWaiterMutex.Unlock() + return } func (me *Client) pieceHashed(t *torrent, piece pp.Integer, correct bool) {