// 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()
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
// 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
r.mu.Unlock()
}
-func (r *reader) SetReadaheadFunc(f func() int64) {
+func (r *reader) SetReadaheadFunc(f ReadaheadFunc) {
r.mu.Lock()
r.readaheadFunc = f
r.posChanged()
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
}
// 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
}