...

Source file src/pkg/net/splice_linux.go

     1	// Copyright 2018 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	package net
     6	
     7	import (
     8		"internal/poll"
     9		"io"
    10	)
    11	
    12	// splice transfers data from r to c using the splice system call to minimize
    13	// copies from and to userspace. c must be a TCP connection. Currently, splice
    14	// is only enabled if r is a TCP or a stream-oriented Unix connection.
    15	//
    16	// If splice returns handled == false, it has performed no work.
    17	func splice(c *netFD, r io.Reader) (written int64, err error, handled bool) {
    18		var remain int64 = 1 << 62 // by default, copy until EOF
    19		lr, ok := r.(*io.LimitedReader)
    20		if ok {
    21			remain, r = lr.N, lr.R
    22			if remain <= 0 {
    23				return 0, nil, true
    24			}
    25		}
    26	
    27		var s *netFD
    28		if tc, ok := r.(*TCPConn); ok {
    29			s = tc.fd
    30		} else if uc, ok := r.(*UnixConn); ok {
    31			if uc.fd.net != "unix" {
    32				return 0, nil, false
    33			}
    34			s = uc.fd
    35		} else {
    36			return 0, nil, false
    37		}
    38	
    39		written, handled, sc, err := poll.Splice(&c.pfd, &s.pfd, remain)
    40		if lr != nil {
    41			lr.N -= written
    42		}
    43		return written, wrapSyscallError(sc, err), handled
    44	}
    45	

View as plain text