fix speed

This commit is contained in:
YouROK
2021-10-20 15:22:20 +03:00
parent ffed0cdec6
commit 679814d4ad

View File

@@ -24,7 +24,7 @@ type Reader struct {
///Preload ///Preload
lastAccess int64 lastAccess int64
isUse bool isUse bool
muPreload sync.Mutex mu sync.Mutex
ranges Range ranges Range
} }
@@ -35,6 +35,7 @@ func newReader(file *torrent.File, cache *Cache) *Reader {
r.SetReadahead(0) r.SetReadahead(0)
r.cache = cache r.cache = cache
r.isUse = true
cache.muReaders.Lock() cache.muReaders.Lock()
cache.readers[r] = struct{}{} cache.readers[r] = struct{}{}
@@ -54,6 +55,7 @@ func (r *Reader) Seek(offset int64, whence int) (n int64, err error) {
case io.SeekEnd: case io.SeekEnd:
r.offset = r.file.Length() + offset r.offset = r.file.Length() + offset
} }
r.readerOn()
n, err = r.Reader.Seek(offset, whence) n, err = r.Reader.Seek(offset, whence)
r.offset = n r.offset = n
r.lastAccess = time.Now().Unix() r.lastAccess = time.Now().Unix()
@@ -66,6 +68,7 @@ func (r *Reader) Read(p []byte) (n int, err error) {
return return
} }
if r.file.Torrent() != nil && r.file.Torrent().Info() != nil { if r.file.Torrent() != nil && r.file.Torrent().Info() != nil {
r.readerOn()
n, err = r.Reader.Read(p) n, err = r.Reader.Read(p)
//samsung tv fix xvid/divx //samsung tv fix xvid/divx
@@ -95,16 +98,12 @@ func (r *Reader) Read(p []byte) (n int, err error) {
} }
func (r *Reader) SetReadahead(length int64) { func (r *Reader) SetReadahead(length int64) {
if !r.isUse && r.cache != nil {
//fix read a head on not readed reader
r.Reader.SetReadahead(0)
r.readahead = 0
return
}
if r.cache != nil && length > r.cache.capacity { if r.cache != nil && length > r.cache.capacity {
length = r.cache.capacity length = r.cache.capacity
} }
if r.isUse {
r.Reader.SetReadahead(length) r.Reader.SetReadahead(length)
}
r.readahead = length r.readahead = length
} }
@@ -165,13 +164,33 @@ func (r *Reader) getOffsetRange() (int64, int64) {
func (r *Reader) checkReader() { func (r *Reader) checkReader() {
if time.Now().Unix() > r.lastAccess+60 && len(r.cache.readers) > 1 { if time.Now().Unix() > r.lastAccess+60 && len(r.cache.readers) > 1 {
r.readerOff()
} else {
r.readerOn()
}
}
func (r *Reader) readerOn() {
r.mu.Lock()
defer r.mu.Unlock()
if !r.isUse {
if pos, err := r.Reader.Seek(0, io.SeekCurrent); err == nil && pos == 0 {
r.Reader.Seek(r.offset, io.SeekStart)
}
r.SetReadahead(r.readahead)
r.isUse = true
}
}
func (r *Reader) readerOff() {
r.mu.Lock()
defer r.mu.Unlock()
if r.isUse {
r.SetReadahead(0) r.SetReadahead(0)
r.isUse = false r.isUse = false
if r.offset > 0 { if r.offset > 0 {
r.Reader.Seek(0, io.SeekStart) r.Reader.Seek(0, io.SeekStart)
} }
} else {
r.isUse = true
} }
} }