diff options
Diffstat (limited to 'debian/patches/src_libgo_go_net_sendfile_gnu.go.diff')
-rw-r--r-- | debian/patches/src_libgo_go_net_sendfile_gnu.go.diff | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/debian/patches/src_libgo_go_net_sendfile_gnu.go.diff b/debian/patches/src_libgo_go_net_sendfile_gnu.go.diff new file mode 100644 index 0000000..7a4aea4 --- /dev/null +++ b/debian/patches/src_libgo_go_net_sendfile_gnu.go.diff @@ -0,0 +1,84 @@ +Index: gcc-6-6.2.1-4.1/src/libgo/go/net/sendfile_gnu.go +=================================================================== +--- /dev/null ++++ gcc-6-6.2.1-4.1/src/libgo/go/net/sendfile_gnu.go +@@ -0,0 +1,79 @@ ++// 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 net ++ ++import ( ++ "io" ++ "os" ++ "syscall" ++) ++ ++// maxSendfileSize is the largest chunk size we ask the kernel to copy ++// at a time. ++const maxSendfileSize int = 4 << 20 ++ ++// sendFile copies the contents of r to c using the sendfile ++// system call to minimize copies. ++// ++// if handled == true, sendFile returns the number of bytes copied and any ++// non-EOF error. ++// ++// if handled == false, sendFile performed no work. ++func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) { ++ var remain int64 = 1 << 62 // by default, copy until EOF ++ ++ lr, ok := r.(*io.LimitedReader) ++ if ok { ++ remain, r = lr.N, lr.R ++ if remain <= 0 { ++ return 0, nil, true ++ } ++ } ++ f, ok := r.(*os.File) ++ if !ok { ++ return 0, nil, false ++ } ++ ++ if err := c.writeLock(); err != nil { ++ return 0, err, true ++ } ++ defer c.writeUnlock() ++ ++ dst := c.sysfd ++ src := int(f.Fd()) ++ for remain > 0 { ++ n := maxSendfileSize ++ if int64(n) > remain { ++ n = int(remain) ++ } ++ n, err1 := syscall.Sendfile(dst, src, nil, n) ++ if n > 0 { ++ written += int64(n) ++ remain -= int64(n) ++ } ++ if n == 0 && err1 == nil { ++ break ++ } ++ if err1 == syscall.EAGAIN { ++ if err1 = c.pd.WaitWrite(); err1 == nil { ++ continue ++ } ++ } ++ if err1 != nil { ++ // This includes syscall.ENOSYS (no kernel ++ // support) and syscall.EINVAL (fd types which ++ // don't implement sendfile) ++ err = err1 ++ break ++ } ++ } ++ if lr != nil { ++ lr.N = remain ++ } ++ if err != nil { ++ err = os.NewSyscallError("sendfile", err) ++ } ++ return written, err, written > 0 ++} |