diff options
Diffstat (limited to 'src/internal/poll/sendfile_linux.go')
| -rw-r--r-- | src/internal/poll/sendfile_linux.go | 61 |
1 files changed, 0 insertions, 61 deletions
diff --git a/src/internal/poll/sendfile_linux.go b/src/internal/poll/sendfile_linux.go deleted file mode 100644 index 7e800a3b7e..0000000000 --- a/src/internal/poll/sendfile_linux.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package poll - -import "syscall" - -// maxSendfileSize is the largest chunk size we ask the kernel to copy -// at a time. -// sendfile(2) on Linux will transfer at most 0x7ffff000 (2,147,479,552) -// bytes, which is true on both 32-bit and 64-bit systems. -// See https://man7.org/linux/man-pages/man2/sendfile.2.html#NOTES for details. -const maxSendfileSize int = 0x7ffff000 - -// SendFile wraps the sendfile system call. -func SendFile(dstFD *FD, src int, remain int64) (written int64, err error, handled bool) { - defer func() { - TestHookDidSendFile(dstFD, src, written, err, handled) - }() - if err := dstFD.writeLock(); err != nil { - return 0, err, false - } - defer dstFD.writeUnlock() - - if err := dstFD.pd.prepareWrite(dstFD.isFile); err != nil { - return 0, err, false - } - - dst := dstFD.Sysfd - for remain > 0 { - n := maxSendfileSize - if int64(n) > remain { - n = int(remain) - } - n, err = syscall.Sendfile(dst, src, nil, n) - if n > 0 { - written += int64(n) - remain -= int64(n) - continue - } else if err != syscall.EAGAIN && err != syscall.EINTR { - // This includes syscall.ENOSYS (no kernel - // support) and syscall.EINVAL (fd types which - // don't implement sendfile), and other errors. - // We should end the loop when there is no error - // returned from sendfile(2) or it is not a retryable error. - break - } - if err == syscall.EINTR { - continue - } - if err = dstFD.pd.waitWrite(dstFD.isFile); err != nil { - break - } - } - if err == syscall.EAGAIN { - err = nil - } - handled = written != 0 || (err != syscall.ENOSYS && err != syscall.EINVAL) - return -} |
