client.go | 10 ++++------ peerconn.go | 1 + requesting.go | 12 +++++++----- diff --git a/client.go b/client.go index ea8a4803cc5e54a7c5a3127cc6a5c3841f849ca3..26951e4815d9618975b9fec84be1ee89670c28a0 100644 --- a/client.go +++ b/client.go @@ -53,7 +53,7 @@ stats ConnStats _mu lockWithDeferreds event sync.Cond - closed missinggo.Event + closed chansync.SetOnce config *ClientConfig logger log.Logger @@ -398,10 +398,8 @@ } return } -func (cl *Client) Closed() <-chan struct{} { - cl.lock() - defer cl.unlock() - return cl.closed.C() +func (cl *Client) Closed() chansync.Done { + return cl.closed.Done() } func (cl *Client) eachDhtServer(f func(DhtServer)) { @@ -1518,7 +1516,7 @@ func (cl *Client) acceptLimitClearer() { for { select { - case <-cl.closed.LockedChan(cl.locker()): + case <-cl.closed.Done(): return case <-time.After(15 * time.Minute): cl.lock() diff --git a/peerconn.go b/peerconn.go index ac2b0ddfb721cd1426ee64ea4e7d1f8412f9631f..dc9f9efbe3a60a7e6d13bad8fe7e549bc77ca4ed 100644 --- a/peerconn.go +++ b/peerconn.go @@ -1297,6 +1297,7 @@ c.allStats(add(1, func(cs *ConnStats) *Count { return &cs.ChunksReadUseful })) c.allStats(add(int64(len(msg.Piece)), func(cs *ConnStats) *Count { return &cs.BytesReadUsefulData })) if deletedRequest { c.piecesReceivedSinceLastRequestUpdate++ + c.updateRequests() c.allStats(add(int64(len(msg.Piece)), func(cs *ConnStats) *Count { return &cs.BytesReadUsefulIntendedData })) } for _, f := range c.t.cl.config.Callbacks.ReceivedUsefulData { diff --git a/requesting.go b/requesting.go index f622b0430692987b235a0e0b8fa6bf4eb6c741be..ed1c8d1558346fb139a09fa58ca4317857c1cf96 100644 --- a/requesting.go +++ b/requesting.go @@ -19,14 +19,16 @@ defer cl.unlock() cl.doRequests() return cl.updateRequests.Signaled() }() - // We can probably tune how often to heed this signal. TODO: Currently disabled to retain - // existing behaviour, while the signalling is worked out. - update = nil select { - case <-cl.closed.LockedChan(cl.locker()): + case <-cl.closed.Done(): return - case <-update: case <-time.After(100 * time.Millisecond): + } + select { + case <-cl.closed.Done(): + return + case <-update: + case <-time.After(time.Second): } } }