log.Printf("error reading torrent %q piece %d offset %d, %d bytes: %s", r.t, pi, po, len(b1), err)
r.t.cl.mu.Lock()
r.t.updateAllPieceCompletions()
- r.t.updatePiecePriorities()
+ r.t.updateAllPiecePriorities()
r.t.cl.mu.Unlock()
}
}
}
func (r *Reader) posChanged() {
- p := r.piecesUncached()
- if p == r.pieces {
+ to := r.piecesUncached()
+ from := r.pieces
+ if to == from {
return
}
- r.pieces = p
- r.t.readersChanged()
+ r.pieces = to
+ r.t.readerPosChanged(from, to)
}
func (r *Reader) Seek(off int64, whence int) (ret int64, err error) {
}
func (t *Torrent) readersChanged() {
+ t.updateReaderPieces()
+ t.updateAllPiecePriorities()
+}
+
+func (t *Torrent) updateReaderPieces() {
t.readerNowPieces, t.readerReadaheadPieces = t.readerPiecePriorities()
- t.updatePiecePriorities()
+}
+
+func (t *Torrent) readerPosChanged(from, to pieceRange) {
+ if from == to {
+ return
+ }
+ t.updateReaderPieces()
+ // Order the ranges, high and low.
+ l, h := from, to
+ if l.begin > h.begin {
+ l, h = h, l
+ }
+ if l.end < h.begin {
+ // Two distinct ranges.
+ t.updatePiecePriorities(l.begin, l.end)
+ t.updatePiecePriorities(h.begin, h.end)
+ } else {
+ // Ranges overlap.
+ end := l.end
+ if h.end > end {
+ end = h.end
+ }
+ t.updatePiecePriorities(l.begin, end)
+ }
}
func (t *Torrent) maybeNewConns() {
t.piecePriorityChanged(piece)
}
+func (t *Torrent) updateAllPiecePriorities() {
+ t.updatePiecePriorities(0, len(t.pieces))
+}
+
// Update all piece priorities in one hit. This function should have the same
// output as updatePiecePriority, but across all pieces.
-func (t *Torrent) updatePiecePriorities() {
- for i := range t.pieces {
+func (t *Torrent) updatePiecePriorities(begin, end int) {
+ for i := begin; i < end; i++ {
t.updatePiecePriority(i)
}
}