]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Aggressively wake Readers
authorMatt Joiner <anacrolix@gmail.com>
Sun, 4 Feb 2018 11:47:01 +0000 (22:47 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 4 Feb 2018 11:47:01 +0000 (22:47 +1100)
piece.go
reader.go
torrent.go

index 5db87d6a66694472a6ed6d343a74f6adcada6541..d29d1dc88accf89e0ee7023e30c07a1bc27cc071 100644 (file)
--- a/piece.go
+++ b/piece.go
@@ -94,6 +94,7 @@ func (p *Piece) numDirtyChunks() (ret int) {
 
 func (p *Piece) unpendChunkIndex(i int) {
        p.dirtyChunks.Add(i)
+       p.t.tickleReaders()
 }
 
 func (p *Piece) pendChunkIndex(i int) {
index 40241e070fd133d44928d0a44c4d370c869b8f04..c8eae097b345a9d523a62d5f2d57f591599d4c3e 100644 (file)
--- a/reader.go
+++ b/reader.go
@@ -147,7 +147,7 @@ func (r *reader) ReadContext(ctx context.Context, b []byte) (n int, err error) {
                        <-ctx.Done()
                        r.t.cl.mu.Lock()
                        ctxErr = ctx.Err()
-                       r.t.cl.event.Broadcast()
+                       r.t.tickleReaders()
                        r.t.cl.mu.Unlock()
                }()
        }
index a23029bcbac44a78d333cab054a682821826c7a0..69ad0ca0b02c78be72f1fdff4ecdc03e5542c36e 100644 (file)
@@ -138,6 +138,10 @@ type Torrent struct {
        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) numPiecesCompleted() (num int) {
 
 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 @@ func (t *Torrent) updatePieceCompletion(piece int) {
        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 {