From ff69ac7a0ee83c5bdd5c78b3d543c6d13ae281ce Mon Sep 17 00:00:00 2001 From: v2ray Date: Fri, 11 Mar 2016 23:51:58 +0100 Subject: [PATCH] Release all references --- common/common.go | 2 ++ common/io/reader.go | 10 ++++++++++ common/io/writer.go | 4 ++++ common/net/timed_io.go | 5 +++++ common/protocol/user.go | 4 ++++ proxy/vmess/inbound/inbound.go | 7 ++++++- proxy/vmess/io/reader.go | 4 ++++ proxy/vmess/io/writer.go | 4 ++++ transport/hub/tcp.go | 11 +++-------- 9 files changed, 42 insertions(+), 9 deletions(-) diff --git a/common/common.go b/common/common.go index 3bb40c8d..3f23d295 100644 --- a/common/common.go +++ b/common/common.go @@ -10,6 +10,8 @@ var ( ErrorAlreadyReleased = errors.New("Object already released.") ) +// Releasable interface is for those types that can release its members. type Releasable interface { + // Release releases all references to accelerate garbage collection. Release() } diff --git a/common/io/reader.go b/common/io/reader.go index 5dd18fba..d0a438a6 100644 --- a/common/io/reader.go +++ b/common/io/reader.go @@ -3,6 +3,7 @@ package io // import "github.com/v2ray/v2ray-core/common/io" import ( "io" + "github.com/v2ray/v2ray-core/common" "github.com/v2ray/v2ray-core/common/alloc" ) @@ -23,6 +24,11 @@ type Reader interface { Read() (*alloc.Buffer, error) } +type ReleasableReader interface { + Reader + common.Releasable +} + // AdaptiveReader is a Reader that adjusts its reading speed automatically. type AdaptiveReader struct { reader io.Reader @@ -57,3 +63,7 @@ func (this *AdaptiveReader) Read() (*alloc.Buffer, error) { } return buffer, nil } + +func (this *AdaptiveReader) Release() { + this.reader = nil +} diff --git a/common/io/writer.go b/common/io/writer.go index 7fefa9d7..007d5efc 100644 --- a/common/io/writer.go +++ b/common/io/writer.go @@ -32,3 +32,7 @@ func (this *AdaptiveWriter) Write(buffer *alloc.Buffer) error { } return err } + +func (this *AdaptiveWriter) Release() { + this.writer = nil +} diff --git a/common/net/timed_io.go b/common/net/timed_io.go index 5415c781..5e0e9227 100644 --- a/common/net/timed_io.go +++ b/common/net/timed_io.go @@ -50,6 +50,11 @@ func (reader *TimeOutReader) SetTimeOut(value int) { } } +func (reader *TimeOutReader) Release() { + reader.connection = nil + reader.worker = nil +} + type timedReaderWorker struct { timeout int connection net.Conn diff --git a/common/protocol/user.go b/common/protocol/user.go index b4363ed1..5feb0406 100644 --- a/common/protocol/user.go +++ b/common/protocol/user.go @@ -57,3 +57,7 @@ func GetUserSettings(level UserLevel) UserSettings { } return settings } + +type Account interface { + CryptionKey() []byte +} diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 487e7ce2..5559727d 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -118,8 +118,11 @@ func (this *VMessInboundHandler) HandleConnection(connection *hub.TCPConn) { defer connection.Close() connReader := v2net.NewTimeOutReader(16, connection) + defer connReader.Release() reader := v2io.NewBufferedReader(connReader) + defer reader.Release() + session := raw.NewServerSession(this.clients) request, err := session.DecodeRequestHeader(reader) @@ -145,7 +148,8 @@ func (this *VMessInboundHandler) HandleConnection(connection *hub.TCPConn) { defer close(input) defer readFinish.Unlock() bodyReader := session.DecodeRequestBody(reader) - var requestReader v2io.Reader + var requestReader v2io.ReleasableReader + defer requestReader.Release() if request.Option.IsChunkStream() { requestReader = vmessio.NewAuthChunkReader(bodyReader) } else { @@ -155,6 +159,7 @@ func (this *VMessInboundHandler) HandleConnection(connection *hub.TCPConn) { }() writer := v2io.NewBufferedWriter(connection) + defer writer.Release() response := &proto.ResponseHeader{ Command: this.generateCommand(request), diff --git a/proxy/vmess/io/reader.go b/proxy/vmess/io/reader.go index a31d4feb..188b8bf8 100644 --- a/proxy/vmess/io/reader.go +++ b/proxy/vmess/io/reader.go @@ -44,3 +44,7 @@ func (this *AuthChunkReader) Read() (*alloc.Buffer, error) { buffer.SliceFrom(4) return buffer, nil } + +func (this *AuthChunkReader) Release() { + this.reader = nil +} diff --git a/proxy/vmess/io/writer.go b/proxy/vmess/io/writer.go index 34902d62..a8c987f3 100644 --- a/proxy/vmess/io/writer.go +++ b/proxy/vmess/io/writer.go @@ -23,6 +23,10 @@ func (this *AuthChunkWriter) Write(buffer *alloc.Buffer) error { return this.writer.Write(buffer) } +func (this *AuthChunkWriter) Release() { + this.writer = nil +} + func Authenticate(buffer *alloc.Buffer) { fnvHash := fnv.New32a() fnvHash.Write(buffer.Value) diff --git a/transport/hub/tcp.go b/transport/hub/tcp.go index 2f71a234..c69805ec 100644 --- a/transport/hub/tcp.go +++ b/transport/hub/tcp.go @@ -16,7 +16,6 @@ var ( type TCPConn struct { conn *net.TCPConn listener *TCPHub - dirty bool } func (this *TCPConn) Read(b []byte) (int, error) { @@ -38,8 +37,6 @@ func (this *TCPConn) Close() error { return ErrorClosedConnection } err := this.conn.Close() - this.conn = nil - this.listener = nil return err } @@ -48,11 +45,9 @@ func (this *TCPConn) Release() { return } - if this.dirty { - this.Close() - return - } - this.listener.recycle(this.conn) + this.Close() + this.conn = nil + this.listener = nil } func (this *TCPConn) LocalAddr() net.Addr {