mirror of https://github.com/v2ray/v2ray-core
better memory management
parent
82ee23e6d0
commit
ecb460b16a
|
@ -9,6 +9,7 @@ import (
|
||||||
type ReadVReader struct {
|
type ReadVReader struct {
|
||||||
io.Reader
|
io.Reader
|
||||||
rawConn syscall.RawConn
|
rawConn syscall.RawConn
|
||||||
|
iovects []syscall.Iovec
|
||||||
nBuf int32
|
nBuf int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,13 +32,17 @@ func allocN(n int32) []*Buffer {
|
||||||
func (r *ReadVReader) ReadMultiBuffer() (MultiBuffer, error) {
|
func (r *ReadVReader) ReadMultiBuffer() (MultiBuffer, error) {
|
||||||
bs := allocN(r.nBuf)
|
bs := allocN(r.nBuf)
|
||||||
|
|
||||||
iovecs := make([]syscall.Iovec, r.nBuf)
|
var iovecs []syscall.Iovec
|
||||||
|
if r.iovects != nil {
|
||||||
|
iovecs = r.iovects
|
||||||
|
}
|
||||||
for idx, b := range bs {
|
for idx, b := range bs {
|
||||||
iovecs[idx] = syscall.Iovec{
|
iovecs = append(iovecs, syscall.Iovec{
|
||||||
Base: &(b.v[0]),
|
Base: &(b.v[0]),
|
||||||
}
|
})
|
||||||
iovecs[idx].SetLen(int(Size))
|
iovecs[idx].SetLen(int(Size))
|
||||||
}
|
}
|
||||||
|
r.iovects = iovecs[:0]
|
||||||
|
|
||||||
var nBytes int
|
var nBytes int
|
||||||
|
|
||||||
|
@ -62,6 +67,8 @@ func (r *ReadVReader) ReadMultiBuffer() (MultiBuffer, error) {
|
||||||
return nil, io.EOF
|
return nil, io.EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var isFull bool = (nBytes == int(r.nBuf)*Size)
|
||||||
|
|
||||||
nBuf := 0
|
nBuf := 0
|
||||||
for nBuf < len(bs) {
|
for nBuf < len(bs) {
|
||||||
if nBytes <= 0 {
|
if nBytes <= 0 {
|
||||||
|
@ -81,7 +88,7 @@ func (r *ReadVReader) ReadMultiBuffer() (MultiBuffer, error) {
|
||||||
bs[i] = nil
|
bs[i] = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if int32(nBuf) == r.nBuf && nBuf < 128 {
|
if isFull && nBuf < 128 {
|
||||||
r.nBuf *= 4
|
r.nBuf *= 4
|
||||||
} else {
|
} else {
|
||||||
r.nBuf = int32(nBuf)
|
r.nBuf = int32(nBuf)
|
||||||
|
|
Loading…
Reference in New Issue