fix and refactor reader

This commit is contained in:
YouROK
2020-12-22 13:16:08 +03:00
parent 438b2de298
commit 2ff4b83353
3 changed files with 17 additions and 47 deletions

View File

@@ -238,21 +238,23 @@ func (c *Cache) getRemPieces() []*Piece {
ranges = mergeRange(ranges) ranges = mergeRange(ranges)
for id, p := range c.pieces { for id, p := range c.pieces {
if len(ranges) > 0 {
for _, rr := range ranges {
if id < rr.Start || id > rr.End {
if c.torrent.Piece(id).State().Priority != torrent.PiecePriorityNone {
c.torrent.Piece(id).SetPriority(torrent.PiecePriorityNone)
}
if p.Size > 0 { if p.Size > 0 {
fill += p.Size fill += p.Size
}
if len(ranges) > 0 {
if !inRanges(ranges, id) {
piece := c.torrent.Piece(id)
if piece.State().Priority != torrent.PiecePriorityNone {
piece.SetPriority(torrent.PiecePriorityNone)
}
if p.Size > 0 {
piecesRemove = append(piecesRemove, p) piecesRemove = append(piecesRemove, p)
} }
} }
}
} else { } else {
if c.torrent.Piece(id).State().Priority != torrent.PiecePriorityNone { piece := c.torrent.Piece(id)
c.torrent.Piece(id).SetPriority(torrent.PiecePriorityNone) if piece.State().Priority != torrent.PiecePriorityNone {
piece.SetPriority(torrent.PiecePriorityNone)
} }
} }
} }
@@ -264,34 +266,3 @@ func (c *Cache) getRemPieces() []*Piece {
c.filled = fill c.filled = fill
return piecesRemove return piecesRemove
} }
func mergeRange(ranges []Range) []Range {
if len(ranges) <= 1 {
return ranges
}
// copy ranges
merged := append([]Range(nil), ranges...)
sort.Slice(merged, func(i, j int) bool {
if merged[i].Start < merged[j].Start {
return true
}
if merged[i].Start == merged[j].Start && merged[i].End < merged[j].End {
return true
}
return false
})
j := 0
for i := 1; i < len(merged); i++ {
if merged[j].End >= merged[i].Start {
if merged[j].End < merged[i].End {
merged[j].End = merged[i].End
}
} else {
j++
merged[j] = merged[i]
}
}
return merged[:j+1]
}

View File

@@ -48,7 +48,7 @@ func (r *Reader) Seek(offset int64, whence int) (n int64, err error) {
case io.SeekCurrent: case io.SeekCurrent:
r.offset += offset r.offset += offset
case io.SeekEnd: case io.SeekEnd:
r.offset = r.file.Length() - offset r.offset = r.file.Length() + offset
} }
n, err = r.Reader.Seek(offset, whence) n, err = r.Reader.Seek(offset, whence)
r.offset = n r.offset = n
@@ -93,6 +93,9 @@ func (r *Reader) Close() {
// TODO провверить как будут закрываться ридеры // TODO провверить как будут закрываться ридеры
r.mu.Lock() r.mu.Lock()
r.isClosed = true r.isClosed = true
if len(r.file.Torrent().Files()) > 0 {
r.Reader.Close()
}
r.mu.Unlock() r.mu.Unlock()
go r.cache.getRemPieces() go r.cache.getRemPieces()
} }

View File

@@ -5,10 +5,6 @@ import (
"server/settings" "server/settings"
) )
type Range struct {
Start, End int
}
func (r *Reader) getPiecesRange() Range { func (r *Reader) getPiecesRange() Range {
startOff, endOff := r.getOffsetRange() startOff, endOff := r.getOffsetRange()
return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)} return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)}