From 2410c3eddd0585e5751481f01788f5fb4cac1b16 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 22 Aug 2014 03:42:38 +1000 Subject: [PATCH] Extract function generating all chunk specs for a piece --- torrent.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/torrent.go b/torrent.go index 178f29ae..9fdb79d5 100644 --- a/torrent.go +++ b/torrent.go @@ -358,24 +358,30 @@ func (t *torrent) bitfield() (bf []bool) { return } +func (t *torrent) pieceChunks(piece int) (css []chunkSpec) { + css = make([]chunkSpec, 0, (t.PieceLength(pp.Integer(piece))+chunkSize-1)/chunkSize) + var cs chunkSpec + for left := t.PieceLength(pp.Integer(piece)); left != 0; left -= cs.Length { + cs.Length = left + if cs.Length > chunkSize { + cs.Length = chunkSize + } + css = append(css, cs) + cs.Begin += cs.Length + } + return +} + func (t *torrent) pendAllChunkSpecs(index pp.Integer) { piece := t.Pieces[index] if piece.PendingChunkSpecs == nil { piece.PendingChunkSpecs = make( map[chunkSpec]struct{}, - (t.Info.PieceLength+chunkSize-1)/chunkSize) - } - c := chunkSpec{ - Begin: 0, + (t.PieceLength(index)+chunkSize-1)/chunkSize) } - cs := piece.PendingChunkSpecs - for left := pp.Integer(t.PieceLength(index)); left != 0; left -= c.Length { - c.Length = left - if c.Length > chunkSize { - c.Length = chunkSize - } - cs[c] = struct{}{} - c.Begin += c.Length + pcss := piece.PendingChunkSpecs + for _, cs := range t.pieceChunks(int(index)) { + pcss[cs] = struct{}{} } t.PiecesByBytesLeft.ValueChanged(piece.bytesLeftElement) return -- 2.48.1