Add Reader.SetReadaheadFunc

Fixes https://github.com/anacrolix/torrent/issues/687.
This commit is contained in:
Matt Joiner 2021-11-11 10:24:28 +11:00
parent 71cbea2fbc
commit 9cc3201df9
1 changed files with 12 additions and 1 deletions

View File

@ -17,8 +17,12 @@ type Reader interface {
io.ReadSeekCloser
missinggo.ReadContexter
// Configure the number of bytes ahead of a read that should also be prioritized in preparation
// for further reads.
// for further reads. Overridden by non-nil readahead func, see SetReadaheadFunc.
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)
// 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()
@ -75,6 +79,13 @@ func (r *reader) SetReadahead(readahead int64) {
r.mu.Unlock()
}
func (r *reader) SetReadaheadFunc(f func() int64) {
r.mu.Lock()
r.readaheadFunc = f
r.posChanged()
r.mu.Unlock()
}
// How many bytes are available to read. Max is the most we could require.
func (r *reader) available(off, max int64) (ret int64) {
off += r.offset