]> Sergey Matveev's repositories - btrtrc.git/commitdiff
The fuse library allocates a response data slice for us, so use it
authorMatt Joiner <anacrolix@gmail.com>
Thu, 22 May 2014 14:34:18 +0000 (00:34 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 22 May 2014 14:34:18 +0000 (00:34 +1000)
fs/torrentfs.go

index 02c2e306505a17c192779ce7ecfd06f573bcd32d..a6fb6e5812b7c8bb4945337166a90543b3bcbad8 100644 (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 {