piece.go | 1 + reader.go | 2 +- torrent.go | 6 ++++++ diff --git a/piece.go b/piece.go index 5db87d6a66694472a6ed6d343a74f6adcada6541..d29d1dc88accf89e0ee7023e30c07a1bc27cc071 100644 --- a/piece.go +++ b/piece.go @@ -94,6 +94,7 @@ } func (p *Piece) unpendChunkIndex(i int) { p.dirtyChunks.Add(i) + p.t.tickleReaders() } func (p *Piece) pendChunkIndex(i int) { diff --git a/reader.go b/reader.go index 40241e070fd133d44928d0a44c4d370c869b8f04..c8eae097b345a9d523a62d5f2d57f591599d4c3e 100644 --- a/reader.go +++ b/reader.go @@ -147,7 +147,7 @@ go func() { <-ctx.Done() r.t.cl.mu.Lock() ctxErr = ctx.Err() - r.t.cl.event.Broadcast() + r.t.tickleReaders() r.t.cl.mu.Unlock() }() } diff --git a/torrent.go b/torrent.go index a23029bcbac44a78d333cab054a682821826c7a0..69ad0ca0b02c78be72f1fdff4ecdc03e5542c36e 100644 --- a/torrent.go +++ b/torrent.go @@ -138,6 +138,10 @@ // Count of each request across active connections. pendingRequests map[request]int } +func (t *Torrent) tickleReaders() { + t.cl.event.Broadcast() +} + // Returns a channel that is closed when the Torrent is closed. func (t *Torrent) Closed() <-chan struct{} { return t.closed.LockedChan(&t.cl.mu) @@ -672,6 +676,7 @@ } func (t *Torrent) close() (err error) { t.closed.Set() + t.tickleReaders() if t.storage != nil { t.storageLock.Lock() t.storage.Close() @@ -1078,6 +1083,7 @@ changed := t.completedPieces.Get(piece) != pcu.Complete || p.storageCompletionOk != pcu.Ok log.Fmsg("piece %d completion: %v", piece, pcu.Ok).AddValue(debugLogValue).Log(t.logger) p.storageCompletionOk = pcu.Ok t.completedPieces.Set(piece, pcu.Complete) + t.tickleReaders() // log.Printf("piece %d uncached completion: %v", piece, pcu.Complete) // log.Printf("piece %d changed: %v", piece, changed) if changed {