| 687 | } |
| 688 | |
| 689 | func (ff *fsFile) bigFileReader() (io.Reader, error) { |
| 690 | if ff.f == nil { |
| 691 | return nil, errors.New("bug: ff.f must be non-nil in bigFileReader") |
| 692 | } |
| 693 | |
| 694 | var r io.Reader |
| 695 | |
| 696 | ff.bigFilesLock.Lock() |
| 697 | n := len(ff.bigFiles) |
| 698 | if n > 0 { |
| 699 | r = ff.bigFiles[n-1] |
| 700 | ff.bigFiles = ff.bigFiles[:n-1] |
| 701 | } |
| 702 | ff.bigFilesLock.Unlock() |
| 703 | |
| 704 | if r != nil { |
| 705 | return r, nil |
| 706 | } |
| 707 | |
| 708 | f, err := ff.h.filesystem.Open(ff.filename) |
| 709 | if err != nil { |
| 710 | return nil, fmt.Errorf("cannot open already opened file: %w", err) |
| 711 | } |
| 712 | return &bigFileReader{ |
| 713 | f: f, |
| 714 | ff: ff, |
| 715 | r: f, |
| 716 | }, nil |
| 717 | } |
| 718 | |
| 719 | func (ff *fsFile) Release() { |
| 720 | if ff.f != nil { |