You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/server/handlers/proxy/buffer.go

60 lines
901 B
Go

package proxy
import (
"errors"
"io"
"sync"
)
const (
DefaultBufferSize = 16 * 1024
)
var sharedBufferPool = sync.Pool{
New: func() interface{} {
buffer := make([]byte, DefaultBufferSize)
return &buffer
},
}
func getBuffer() *[]byte {
return sharedBufferPool.Get().(*[]byte)
}
func putBuffer(buffer *[]byte) {
sharedBufferPool.Put(buffer)
}
func copyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
buf := getBuffer()
defer putBuffer(buf)
for {
nr, er := src.Read(*buf)
if nr > 0 {
nw, ew := dst.Write((*buf)[0:nr])
if nw < 0 || nr < nw {
nw = 0
if ew == nil {
ew = errors.New("invalid write result")
}
}
written += int64(nw)
if ew != nil {
err = ew
break
}
if nr != nw {
err = io.ErrShortWrite
break
}
}
if er != nil {
if er != io.EOF {
err = er
}
break
}
}
return written, err
}