reader.go | 23 +++++++++++++++++------ t.go | 2 +- diff --git a/reader.go b/reader.go index c8af14640bb813e98eabeca5305aa02532ffaba1..a8264ed1d637250db21705180757ec3e4e4ffbdc 100644 --- a/reader.go +++ b/reader.go @@ -22,7 +22,7 @@ SetReadahead(int64) // If non-nil, the provided function is called when the implementation needs to know the // readahead for the current reader. Calls occur during Reads and Seeks, and while the Client is // locked. - SetReadaheadFunc(func() int64) + SetReadaheadFunc(ReadaheadFunc) // Don't wait for pieces to complete and be verified. Read calls return as soon as they can when // the underlying chunks become available. SetResponsive() @@ -32,6 +32,14 @@ // Piece range by piece index, [begin, end). type pieceRange struct { begin, end pieceIndex } + +type ReadaheadContext struct { + ContiguousReadStartPos int64 + CurrentPos int64 +} + +// Returns the desired readahead for a Reader. +type ReadaheadFunc func(ReadaheadContext) int64 type reader struct { t *Torrent @@ -39,7 +47,7 @@ // Adjust the read/seek window to handle Readers locked to File extents and the like. offset, length int64 // Function to dynamically calculate readahead. If nil, readahead is static. - readaheadFunc func() int64 + readaheadFunc ReadaheadFunc // Required when modifying pos and readahead. mu sync.Locker @@ -79,7 +87,7 @@ r.posChanged() r.mu.Unlock() } -func (r *reader) SetReadaheadFunc(f func() int64) { +func (r *reader) SetReadaheadFunc(f ReadaheadFunc) { r.mu.Lock() r.readaheadFunc = f r.posChanged() @@ -116,7 +124,10 @@ // Calculates the pieces this reader wants downloaded, ignoring the cached value at r.pieces. func (r *reader) piecesUncached() (ret pieceRange) { ra := r.readahead if r.readaheadFunc != nil { - ra = r.readaheadFunc() + ra = r.readaheadFunc(ReadaheadContext{ + ContiguousReadStartPos: r.contiguousReadStartPos, + CurrentPos: r.pos, + }) } if ra < 1 { // Needs to be at least 1, because [x, x) means we don't want @@ -303,6 +314,6 @@ r.t.logger.Log(m.Skip(1)) } // Implementation inspired by https://news.ycombinator.com/item?id=27019613. -func (r *reader) defaultReadaheadFunc() int64 { - return r.pos - r.contiguousReadStartPos +func defaultReadaheadFunc(r ReadaheadContext) int64 { + return r.CurrentPos - r.ContiguousReadStartPos } diff --git a/t.go b/t.go index 580a3bc91c9cf789156431c9a24f405e8d77da90..d861e14e979cf85eb65faafc2ba7eca4e7878da8 100644 --- a/t.go +++ b/t.go @@ -42,7 +42,7 @@ t: t, offset: offset, length: length, } - r.readaheadFunc = r.defaultReadaheadFunc + r.readaheadFunc = defaultReadaheadFunc t.addReader(&r) return &r }