file.go | 12 +++++++++--- torrent.go | 17 ++++++++++++----- diff --git a/file.go b/file.go index 7cc0ad64bf5d67f520ba37863f8c7d368fb78b13..5983b855e1d46f470b8b804aac05a1dea333c423 100644 --- a/file.go +++ b/file.go @@ -121,7 +121,7 @@ if prio == f.prio { return } f.prio = prio - f.t.updatePiecePriorities(f.firstPieceIndex().Int(), f.lastPieceIndex().Int()+1) + f.t.updatePiecePriorities(f.firstPieceIndex().Int(), f.endPieceIndex().Int()) } // Returns the priority per File.SetPriority. @@ -132,9 +132,15 @@ return f.prio } func (f *File) firstPieceIndex() pwp.Integer { + if f.t.usualPieceSize() == 0 { + return 0 + } return pwp.Integer(f.offset / int64(f.t.usualPieceSize())) } -func (f *File) lastPieceIndex() pwp.Integer { - return pwp.Integer((f.offset + f.length) / int64(f.t.usualPieceSize())) +func (f *File) endPieceIndex() pwp.Integer { + if f.t.usualPieceSize() == 0 { + return 0 + } + return pwp.Integer((f.offset+f.length-1)/int64(f.t.usualPieceSize())) + 1 } diff --git a/torrent.go b/torrent.go index 981f5b85a83776e7eeb9bd8fb55fed93b27985e1..6440a3f823636e4925d6465ad82c6be5a56985f7 100644 --- a/torrent.go +++ b/torrent.go @@ -305,26 +305,33 @@ piece.t = t piece.index = i piece.noPendingWrites.L = &piece.pendingWritesMutex missinggo.CopyExact(piece.hash[:], hash) - piece.files = (*t.files)[pieceFirstFileIndex(piece.torrentBeginOffset(), *t.files):pieceLastFileIndex(piece.torrentEndOffset(), *t.files)] + files := *t.files + beginFile := pieceFirstFileIndex(piece.torrentBeginOffset(), files) + endFile := pieceEndFileIndex(piece.torrentEndOffset(), files) + piece.files = files[beginFile:endFile] } } +// Returns the index of the first file containing the piece. files must be +// ordered by offset. func pieceFirstFileIndex(pieceOffset int64, files []*File) int { for i, f := range files { if f.offset+f.length > pieceOffset { return i } } - return -1 + return 0 } -func pieceLastFileIndex(pieceEndOffset int64, files []*File) int { +// Returns the index after the last file containing the piece. files must be +// ordered by offset. +func pieceEndFileIndex(pieceEndOffset int64, files []*File) int { for i, f := range files { if f.offset+f.length >= pieceEndOffset { - return i + return i + 1 } } - return -1 + return 0 } func (t *Torrent) cacheLength(info *metainfo.Info) {