10 "github.com/anacrolix/missinggo"
12 "github.com/anacrolix/torrent"
15 type fileHandle struct {
25 func (me fileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
26 torrentfsReadRequests.Add(1)
28 panic("read on directory")
31 pos, err := r.Seek(req.Offset, io.SeekStart)
35 if pos != req.Offset {
38 resp.Data = resp.Data[:req.Size]
39 readDone := make(chan struct{})
40 ctx, cancel := context.WithCancel(ctx)
45 me.fn.FS.blockedReads++
46 me.fn.FS.event.Broadcast()
49 r := missinggo.ContextedReader{r, ctx}
50 log.Printf("reading %v bytes at %v", len(resp.Data), req.Offset)
52 n, readErr = io.ReadFull(r, resp.Data)
54 n, readErr = r.Read(resp.Data)
55 if readErr == io.EOF {
59 resp.Data = resp.Data[:n]
64 me.fn.FS.blockedReads--
65 me.fn.FS.event.Broadcast()
73 case <-me.fn.FS.destroyed:
80 func (me fileHandle) Release(context.Context, *fuse.ReleaseRequest) error {