1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2026-01-04 08:15:21 -05:00

use readv reader by default

This commit is contained in:
Darien Raymond
2018-08-25 10:41:39 +02:00
parent 9ad1e034e0
commit 8c841a05fb
6 changed files with 22 additions and 129 deletions

View File

@@ -4,7 +4,6 @@ import (
"io"
"v2ray.com/core/common"
"v2ray.com/core/common/bytespool"
"v2ray.com/core/common/errors"
)
@@ -24,66 +23,6 @@ func readOne(r io.Reader) (*Buffer, error) {
return nil, newError("Reader returns too many empty payloads.")
}
const largeSize = 128 * 1024
// BytesToBufferReader is a Reader that adjusts its reading speed automatically.
type BytesToBufferReader struct {
io.Reader
buffer []byte
}
// NewBytesToBufferReader returns a new BytesToBufferReader.
func NewBytesToBufferReader(reader io.Reader) Reader {
return &BytesToBufferReader{
Reader: reader,
}
}
func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) {
b, err := readOne(r.Reader)
if err != nil {
return nil, err
}
if b.IsFull() && largeSize > Size {
r.buffer = bytespool.Alloc(Size + 100)
}
return NewMultiBufferValue(b), nil
}
func (r *BytesToBufferReader) freeBuffer() {
bytespool.Free(r.buffer)
r.buffer = nil
}
// ReadMultiBuffer implements Reader.
func (r *BytesToBufferReader) ReadMultiBuffer() (MultiBuffer, error) {
if r.buffer == nil || largeSize == Size {
return r.readSmall()
}
nBytes, err := r.Reader.Read(r.buffer)
if nBytes > 0 {
mb := NewMultiBufferCap(int32(nBytes/Size) + 1)
common.Must2(mb.Write(r.buffer[:nBytes]))
if nBytes == len(r.buffer) && nBytes < int(largeSize) {
bytespool.Free(r.buffer)
r.buffer = bytespool.Alloc(int32(nBytes) + 100)
} else if nBytes < Size {
r.freeBuffer()
}
return mb, nil
}
r.freeBuffer()
if err != nil {
return nil, err
}
// Read() returns empty payload and nil err. We don't expect this to happen, but just in case.
return r.readSmall()
}
// BufferedReader is a Reader that keeps its internal buffer.
type BufferedReader struct {
// Reader is the underlying reader to be read from