The fuse library allocates a response data slice for us, so use it

This commit is contained in:
Matt Joiner 2014-05-23 00:34:18 +10:00
parent 96f85be99a
commit f8b06ef65c
1 changed files with 10 additions and 14 deletions

View File

@ -50,30 +50,26 @@ func (fn fileNode) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fus
if req.Dir {
panic("hodor")
}
data := make([]byte, func() int {
_len := int64(fn.size) - req.Offset
if int64(req.Size) < _len {
return req.Size
} else {
// limit read to the end of the file
return int(_len)
}
}())
if len(data) == 0 {
size := req.Size
if int64(fn.size)-req.Offset < int64(size) {
size = int(int64(fn.size) - req.Offset)
}
if size == 0 {
return nil
}
infoHash := torrent.BytesInfoHash(fn.metaInfo.InfoHash)
torrentOff := fn.TorrentOffset + req.Offset
log.Print(torrentOff, len(data), fn.TorrentOffset)
if err := fn.FS.Client.PrioritizeDataRegion(infoHash, torrentOff, int64(len(data))); err != nil {
log.Print(torrentOff, size, fn.TorrentOffset)
if err := fn.FS.Client.PrioritizeDataRegion(infoHash, torrentOff, int64(size)); err != nil {
panic(err)
}
resp.Data = resp.Data[:size]
for {
dataWaiter := fn.FS.Client.DataWaiter()
n, err := fn.FS.Client.TorrentReadAt(infoHash, torrentOff, data)
n, err := fn.FS.Client.TorrentReadAt(infoHash, torrentOff, resp.Data)
switch err {
case nil:
resp.Data = data[:n]
resp.Data = resp.Data[:n]
return nil
case torrent.ErrDataNotReady:
select {