From f8b06ef65ca7664badad5f5c962b57da632ed4cd Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 23 May 2014 00:34:18 +1000 Subject: [PATCH] The fuse library allocates a response data slice for us, so use it --- fs/torrentfs.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/fs/torrentfs.go b/fs/torrentfs.go index 02c2e306..a6fb6e58 100644 --- a/fs/torrentfs.go +++ b/fs/torrentfs.go @@ -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 { -- 2.48.1