URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [net/] [sendfile_linux.go] - Rev 747
Compare with Previous | Blame | View Log
// 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 netimport ("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 EOFlr, ok := r.(*io.LimitedReader)if ok {remain, r = lr.N, lr.Rif remain <= 0 {return 0, nil, true}}f, ok := r.(*os.File)if !ok {return 0, nil, false}c.wio.Lock()defer c.wio.Unlock()c.incref()defer c.decref()dst := c.sysfdsrc := f.Fd()for remain > 0 {n := maxSendfileSizeif 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 && c.wdeadline >= 0 {pollserver.WaitWrite(c)continue}if err1 != nil {// This includes syscall.ENOSYS (no kernel// support) and syscall.EINVAL (fd types which// don't implement sendfile together)err = &OpError{"sendfile", c.net, c.raddr, err1}break}}if lr != nil {lr.N = remain}return written, err, written > 0}
