*os.File
}
+func (c classicFileReader) writeToN(w io.Writer, n int64) (written int64, err error) {
+ lw := limitWriter{
+ rem: n,
+ w: w,
+ }
+ return c.File.WriteTo(&lw)
+}
+
func (c classicFileReader) seekDataOrEof(offset int64) (ret int64, err error) {
ret, err = seekData(c.File, offset)
if err == io.EOF {
return
}
+func (me *mmapFileHandle) writeToN(w io.Writer, n int64) (written int64, err error) {
+ b := me.shared.f.m
+ if me.pos >= int64(len(b)) {
+ return
+ }
+ b = b[me.pos:]
+ b = b[:min(int64(len(b)), n)]
+ i, err := w.Write(b)
+ written = int64(i)
+ me.pos += written
+ return
+}
+
func (me *mmapFileHandle) Close() error {
return me.shared.Close()
}
type fileReader interface {
// Seeks to the next data in the file. If there is no more data, seeks to the end of the file.
seekDataOrEof(offset int64) (ret int64, err error)
- io.WriterTo
+ writeToN(w io.Writer, n int64) (written int64, err error)
io.ReadCloser
}
panicif.NotEq(n1, n)
extentRemaining -= n1
}
- var n1 int64
- if true {
- n1, err = f.WriteTo(&limitWriter{
- rem: extentRemaining,
- w: w,
- })
- // limitWriter will block f from writing too much.
- if n1 == extentRemaining {
- err = nil
- }
- } else {
- n1, err = io.CopyN(w, f, extentRemaining)
- }
+ n1, err := f.writeToN(w, extentRemaining)
packageExpvarMap.Add("bytesReadNotSkipped", n1)
written += n1
return