1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-09 09:20:45 +00:00

remove MultiBuffer.Release

This commit is contained in:
Darien Raymond 2018-11-17 22:45:07 +01:00
parent b41513f644
commit 0f324a613e
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
15 changed files with 46 additions and 51 deletions

View File

@ -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()

View File

@ -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))

View File

@ -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 {

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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
} }

View File

@ -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)

View File

@ -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()

View File

@ -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)
} }

View File

@ -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
} }

View File

@ -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
} }

View File

@ -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:])

View File

@ -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() {

View File

@ -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()
} }

View File

@ -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
} }