mirror of https://github.com/v2ray/v2ray-core
remove MultiBuffer.Release
parent
b41513f644
commit
0f324a613e
|
@ -37,7 +37,7 @@ func (r *cachedReader) Cache(b *buf.Buffer) {
|
||||||
mb, _ := r.reader.ReadMultiBufferTimeout(time.Millisecond * 100)
|
mb, _ := r.reader.ReadMultiBufferTimeout(time.Millisecond * 100)
|
||||||
r.Lock()
|
r.Lock()
|
||||||
if !mb.IsEmpty() {
|
if !mb.IsEmpty() {
|
||||||
common.Must(r.cache.WriteMultiBuffer(mb))
|
r.cache, _ = buf.MergeMulti(r.cache, mb)
|
||||||
}
|
}
|
||||||
b.Clear()
|
b.Clear()
|
||||||
rawBytes := b.Extend(buf.Size)
|
rawBytes := b.Extend(buf.Size)
|
||||||
|
@ -75,8 +75,7 @@ func (r *cachedReader) ReadMultiBufferTimeout(timeout time.Duration) (buf.MultiB
|
||||||
func (r *cachedReader) CloseError() {
|
func (r *cachedReader) CloseError() {
|
||||||
r.Lock()
|
r.Lock()
|
||||||
if r.cache != nil {
|
if r.cache != nil {
|
||||||
r.cache.Release()
|
r.cache = buf.ReleaseMulti(r.cache)
|
||||||
r.cache = nil
|
|
||||||
}
|
}
|
||||||
r.Unlock()
|
r.Unlock()
|
||||||
r.reader.CloseError()
|
r.reader.CloseError()
|
||||||
|
|
|
@ -36,7 +36,7 @@ func TestStatsWriter(t *testing.T) {
|
||||||
common.Must2(mb.Write([]byte("abcd")))
|
common.Must2(mb.Write([]byte("abcd")))
|
||||||
common.Must(writer.WriteMultiBuffer(mb))
|
common.Must(writer.WriteMultiBuffer(mb))
|
||||||
|
|
||||||
mb.Release()
|
mb = buf.ReleaseMulti(mb)
|
||||||
common.Must2(mb.Write([]byte("efg")))
|
common.Must2(mb.Write([]byte("efg")))
|
||||||
common.Must(writer.WriteMultiBuffer(mb))
|
common.Must(writer.WriteMultiBuffer(mb))
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) {
|
||||||
mb := make(MultiBuffer, 0, 128)
|
mb := make(MultiBuffer, 0, 128)
|
||||||
|
|
||||||
if _, err := mb.ReadFrom(reader); err != nil {
|
if _, err := mb.ReadFrom(reader); err != nil {
|
||||||
mb.Release()
|
ReleaseMulti(mb)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ func ReadAllToBytes(reader io.Reader) ([]byte, error) {
|
||||||
}
|
}
|
||||||
b := make([]byte, mb.Len())
|
b := make([]byte, mb.Len())
|
||||||
common.Must2(mb.Read(b))
|
common.Must2(mb.Read(b))
|
||||||
mb.Release()
|
ReleaseMulti(mb)
|
||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,15 @@ func MergeMulti(dest MultiBuffer, src MultiBuffer) (MultiBuffer, MultiBuffer) {
|
||||||
return dest, src[:0]
|
return dest, src[:0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReleaseMulti release all content of the MultiBuffer, and returns an empty MultiBuffer.
|
||||||
|
func ReleaseMulti(mb MultiBuffer) MultiBuffer {
|
||||||
|
for i := range mb {
|
||||||
|
mb[i].Release()
|
||||||
|
mb[i] = nil
|
||||||
|
}
|
||||||
|
return mb[:0]
|
||||||
|
}
|
||||||
|
|
||||||
// Copy copied the beginning part of the MultiBuffer into the given byte array.
|
// Copy copied the beginning part of the MultiBuffer into the given byte array.
|
||||||
func (mb MultiBuffer) Copy(b []byte) int {
|
func (mb MultiBuffer) Copy(b []byte) int {
|
||||||
total := 0
|
total := 0
|
||||||
|
@ -107,7 +116,9 @@ func (mb *MultiBuffer) Read(b []byte) (int, error) {
|
||||||
|
|
||||||
// WriteTo implements io.WriterTo.
|
// WriteTo implements io.WriterTo.
|
||||||
func (mb *MultiBuffer) WriteTo(writer io.Writer) (int64, error) {
|
func (mb *MultiBuffer) WriteTo(writer io.Writer) (int64, error) {
|
||||||
defer mb.Release()
|
defer func() {
|
||||||
|
*mb = ReleaseMulti(*mb)
|
||||||
|
}()
|
||||||
|
|
||||||
totalBytes := int64(0)
|
totalBytes := int64(0)
|
||||||
for _, b := range *mb {
|
for _, b := range *mb {
|
||||||
|
@ -143,10 +154,7 @@ func (mb *MultiBuffer) Write(b []byte) (int, error) {
|
||||||
|
|
||||||
// WriteMultiBuffer implements Writer.
|
// WriteMultiBuffer implements Writer.
|
||||||
func (mb *MultiBuffer) WriteMultiBuffer(b MultiBuffer) error {
|
func (mb *MultiBuffer) WriteMultiBuffer(b MultiBuffer) error {
|
||||||
*mb = append(*mb, b...)
|
*mb, _ = MergeMulti(*mb, b)
|
||||||
for i := range b {
|
|
||||||
b[i] = nil
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,15 +181,7 @@ func (mb MultiBuffer) IsEmpty() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Release releases all Buffers in the MultiBuffer.
|
// String returns the content of the MultiBuffer in string.
|
||||||
func (mb *MultiBuffer) Release() {
|
|
||||||
for i, b := range *mb {
|
|
||||||
b.Release()
|
|
||||||
(*mb)[i] = nil
|
|
||||||
}
|
|
||||||
*mb = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mb MultiBuffer) String() string {
|
func (mb MultiBuffer) String() string {
|
||||||
v := make([]interface{}, len(mb))
|
v := make([]interface{}, len(mb))
|
||||||
for i, b := range mb {
|
for i, b := range mb {
|
||||||
|
|
|
@ -49,7 +49,6 @@ func (r *BufferedReader) Read(b []byte) (int, error) {
|
||||||
nBytes, err := r.Buffer.Read(b)
|
nBytes, err := r.Buffer.Read(b)
|
||||||
common.Must(err)
|
common.Must(err)
|
||||||
if r.Buffer.IsEmpty() {
|
if r.Buffer.IsEmpty() {
|
||||||
r.Buffer.Release()
|
|
||||||
r.Buffer = nil
|
r.Buffer = nil
|
||||||
}
|
}
|
||||||
return nBytes, nil
|
return nBytes, nil
|
||||||
|
@ -123,7 +122,8 @@ func (r *BufferedReader) WriteTo(writer io.Writer) (int64, error) {
|
||||||
// Close implements io.Closer.
|
// Close implements io.Closer.
|
||||||
func (r *BufferedReader) Close() error {
|
func (r *BufferedReader) Close() error {
|
||||||
if !r.Buffer.IsEmpty() {
|
if !r.Buffer.IsEmpty() {
|
||||||
r.Buffer.Release()
|
ReleaseMulti(r.Buffer)
|
||||||
|
r.Buffer = nil
|
||||||
}
|
}
|
||||||
return common.Close(r.Reader)
|
return common.Close(r.Reader)
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,14 +83,12 @@ func (r *ReadVReader) readMulti() (MultiBuffer, error) {
|
||||||
r.mr.Clear()
|
r.mr.Clear()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mb := MultiBuffer(bs)
|
ReleaseMulti(MultiBuffer(bs))
|
||||||
mb.Release()
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if nBytes == 0 {
|
if nBytes == 0 {
|
||||||
mb := MultiBuffer(bs)
|
ReleaseMulti(MultiBuffer(bs))
|
||||||
mb.Release()
|
|
||||||
return nil, io.EOF
|
return nil, io.EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ type BufferToBytesWriter struct {
|
||||||
|
|
||||||
// WriteMultiBuffer implements Writer. This method takes ownership of the given buffer.
|
// WriteMultiBuffer implements Writer. This method takes ownership of the given buffer.
|
||||||
func (w *BufferToBytesWriter) WriteMultiBuffer(mb MultiBuffer) error {
|
func (w *BufferToBytesWriter) WriteMultiBuffer(mb MultiBuffer) error {
|
||||||
defer mb.Release()
|
defer ReleaseMulti(mb)
|
||||||
|
|
||||||
size := mb.Len()
|
size := mb.Len()
|
||||||
if size == 0 {
|
if size == 0 {
|
||||||
|
@ -134,7 +134,7 @@ func (w *BufferedWriter) WriteMultiBuffer(b MultiBuffer) error {
|
||||||
return w.writer.WriteMultiBuffer(b)
|
return w.writer.WriteMultiBuffer(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer b.Release()
|
defer ReleaseMulti(b)
|
||||||
|
|
||||||
for !b.IsEmpty() {
|
for !b.IsEmpty() {
|
||||||
if w.buffer == nil {
|
if w.buffer == nil {
|
||||||
|
@ -216,7 +216,7 @@ type SequentialWriter struct {
|
||||||
|
|
||||||
// WriteMultiBuffer implements Writer.
|
// WriteMultiBuffer implements Writer.
|
||||||
func (w *SequentialWriter) WriteMultiBuffer(mb MultiBuffer) error {
|
func (w *SequentialWriter) WriteMultiBuffer(mb MultiBuffer) error {
|
||||||
defer mb.Release()
|
defer ReleaseMulti(mb)
|
||||||
|
|
||||||
for _, b := range mb {
|
for _, b := range mb {
|
||||||
if b.IsEmpty() {
|
if b.IsEmpty() {
|
||||||
|
@ -234,7 +234,7 @@ func (w *SequentialWriter) WriteMultiBuffer(mb MultiBuffer) error {
|
||||||
type noOpWriter byte
|
type noOpWriter byte
|
||||||
|
|
||||||
func (noOpWriter) WriteMultiBuffer(b MultiBuffer) error {
|
func (noOpWriter) WriteMultiBuffer(b MultiBuffer) error {
|
||||||
b.Release()
|
ReleaseMulti(b)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -202,7 +202,7 @@ func (r *AuthenticationReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
||||||
const readSize = 16
|
const readSize = 16
|
||||||
mb := make(buf.MultiBuffer, 0, readSize)
|
mb := make(buf.MultiBuffer, 0, readSize)
|
||||||
if err := r.readInternal(false, &mb); err != nil {
|
if err := r.readInternal(false, &mb); err != nil {
|
||||||
mb.Release()
|
buf.ReleaseMulti(mb)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ func (r *AuthenticationReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mb.Release()
|
buf.ReleaseMulti(mb)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -269,7 +269,7 @@ func (w *AuthenticationWriter) seal(b []byte) (*buf.Buffer, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error {
|
func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error {
|
||||||
defer mb.Release()
|
defer buf.ReleaseMulti(mb)
|
||||||
|
|
||||||
var maxPadding int32
|
var maxPadding int32
|
||||||
if w.padding != nil {
|
if w.padding != nil {
|
||||||
|
@ -286,7 +286,7 @@ func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error {
|
||||||
b.Release()
|
b.Release()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mb2Write.Release()
|
buf.ReleaseMulti(mb2Write)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
mb2Write = append(mb2Write, eb)
|
mb2Write = append(mb2Write, eb)
|
||||||
|
@ -299,7 +299,7 @@ func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *AuthenticationWriter) writePacket(mb buf.MultiBuffer) error {
|
func (w *AuthenticationWriter) writePacket(mb buf.MultiBuffer) error {
|
||||||
defer mb.Release()
|
defer buf.ReleaseMulti(mb)
|
||||||
|
|
||||||
mb2Write := make(buf.MultiBuffer, 0, len(mb)+1)
|
mb2Write := make(buf.MultiBuffer, 0, len(mb)+1)
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ func (w *Writer) writeData(mb buf.MultiBuffer) error {
|
||||||
|
|
||||||
// WriteMultiBuffer implements buf.Writer.
|
// WriteMultiBuffer implements buf.Writer.
|
||||||
func (w *Writer) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
func (w *Writer) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
||||||
defer mb.Release()
|
defer buf.ReleaseMulti(mb)
|
||||||
|
|
||||||
if mb.IsEmpty() {
|
if mb.IsEmpty() {
|
||||||
return w.writeMetaOnly()
|
return w.writeMetaOnly()
|
||||||
|
|
|
@ -37,8 +37,8 @@ func Run(args []string, input io.Reader) (buf.MultiBuffer, error) {
|
||||||
if errBuffer.Len() > 0 {
|
if errBuffer.Len() > 0 {
|
||||||
msg += ": " + errBuffer.String()
|
msg += ": " + errBuffer.String()
|
||||||
}
|
}
|
||||||
errBuffer.Release()
|
buf.ReleaseMulti(errBuffer)
|
||||||
outBuffer.Release()
|
buf.ReleaseMulti(outBuffer)
|
||||||
return nil, newError(msg).Base(err)
|
return nil, newError(msg).Base(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package core
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"v2ray.com/core/common"
|
"v2ray.com/core/common"
|
||||||
"v2ray.com/core/common/buf"
|
|
||||||
"v2ray.com/core/common/net"
|
"v2ray.com/core/common/net"
|
||||||
"v2ray.com/core/features/routing"
|
"v2ray.com/core/features/routing"
|
||||||
)
|
)
|
||||||
|
@ -21,11 +21,7 @@ func CreateObject(v *Instance, config interface{}) (interface{}, error) {
|
||||||
// StartInstance starts a new V2Ray instance with given serialized config.
|
// StartInstance starts a new V2Ray instance with given serialized config.
|
||||||
// By default V2Ray only support config in protobuf format, i.e., configFormat = "protobuf". Caller need to load other packages to add JSON support.
|
// By default V2Ray only support config in protobuf format, i.e., configFormat = "protobuf". Caller need to load other packages to add JSON support.
|
||||||
func StartInstance(configFormat string, configBytes []byte) (*Instance, error) {
|
func StartInstance(configFormat string, configBytes []byte) (*Instance, error) {
|
||||||
var mb buf.MultiBuffer
|
config, err := LoadConfig(configFormat, "", bytes.NewReader(configBytes))
|
||||||
defer mb.Release()
|
|
||||||
|
|
||||||
common.Must2(mb.Write(configBytes))
|
|
||||||
config, err := LoadConfig(configFormat, "", &mb)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,8 @@ type ClosableMultiBuffer struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ClosableMultiBuffer) Close() error {
|
func (c *ClosableMultiBuffer) Close() error {
|
||||||
c.MultiBuffer.Release()
|
buf.ReleaseMulti(c.MultiBuffer)
|
||||||
|
c.MultiBuffer = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ func NewChunkWriter(writer io.Writer, auth *Authenticator) *ChunkWriter {
|
||||||
|
|
||||||
// WriteMultiBuffer implements buf.Writer.
|
// WriteMultiBuffer implements buf.Writer.
|
||||||
func (w *ChunkWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
func (w *ChunkWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
||||||
defer mb.Release()
|
defer buf.ReleaseMulti(mb)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
payloadLen, _ := mb.Read(w.buffer[2+AuthSize:])
|
payloadLen, _ := mb.Read(w.buffer[2+AuthSize:])
|
||||||
|
|
|
@ -377,7 +377,7 @@ func (c *Connection) Write(b []byte) (int, error) {
|
||||||
|
|
||||||
// WriteMultiBuffer implements buf.Writer.
|
// WriteMultiBuffer implements buf.Writer.
|
||||||
func (c *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
func (c *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
||||||
defer mb.Release()
|
defer buf.ReleaseMulti(mb)
|
||||||
|
|
||||||
updatePending := false
|
updatePending := false
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|
|
@ -151,7 +151,8 @@ func NewReceivingWorker(kcp *Connection) *ReceivingWorker {
|
||||||
|
|
||||||
func (w *ReceivingWorker) Release() {
|
func (w *ReceivingWorker) Release() {
|
||||||
w.Lock()
|
w.Lock()
|
||||||
w.leftOver.Release()
|
buf.ReleaseMulti(w.leftOver)
|
||||||
|
w.leftOver = nil
|
||||||
w.Unlock()
|
w.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,10 +144,10 @@ func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
||||||
runtime.Gosched()
|
runtime.Gosched()
|
||||||
return nil
|
return nil
|
||||||
case err == errBufferFull && p.option.discardOverflow:
|
case err == errBufferFull && p.option.discardOverflow:
|
||||||
mb.Release()
|
buf.ReleaseMulti(mb)
|
||||||
return nil
|
return nil
|
||||||
case err != errBufferFull:
|
case err != errBufferFull:
|
||||||
mb.Release()
|
buf.ReleaseMulti(mb)
|
||||||
p.readSignal.Signal()
|
p.readSignal.Signal()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ func (p *pipe) CloseError() {
|
||||||
p.state = errord
|
p.state = errord
|
||||||
|
|
||||||
if !p.data.IsEmpty() {
|
if !p.data.IsEmpty() {
|
||||||
p.data.Release()
|
buf.ReleaseMulti(p.data)
|
||||||
p.data = nil
|
p.data = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue