mirror of https://github.com/v2ray/v2ray-core
Release all references
parent
f5960db27e
commit
ff69ac7a0e
|
@ -10,6 +10,8 @@ var (
|
||||||
ErrorAlreadyReleased = errors.New("Object already released.")
|
ErrorAlreadyReleased = errors.New("Object already released.")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Releasable interface is for those types that can release its members.
|
||||||
type Releasable interface {
|
type Releasable interface {
|
||||||
|
// Release releases all references to accelerate garbage collection.
|
||||||
Release()
|
Release()
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package io // import "github.com/v2ray/v2ray-core/common/io"
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
|
"github.com/v2ray/v2ray-core/common"
|
||||||
"github.com/v2ray/v2ray-core/common/alloc"
|
"github.com/v2ray/v2ray-core/common/alloc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,6 +24,11 @@ type Reader interface {
|
||||||
Read() (*alloc.Buffer, error)
|
Read() (*alloc.Buffer, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ReleasableReader interface {
|
||||||
|
Reader
|
||||||
|
common.Releasable
|
||||||
|
}
|
||||||
|
|
||||||
// AdaptiveReader is a Reader that adjusts its reading speed automatically.
|
// AdaptiveReader is a Reader that adjusts its reading speed automatically.
|
||||||
type AdaptiveReader struct {
|
type AdaptiveReader struct {
|
||||||
reader io.Reader
|
reader io.Reader
|
||||||
|
@ -57,3 +63,7 @@ func (this *AdaptiveReader) Read() (*alloc.Buffer, error) {
|
||||||
}
|
}
|
||||||
return buffer, nil
|
return buffer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *AdaptiveReader) Release() {
|
||||||
|
this.reader = nil
|
||||||
|
}
|
||||||
|
|
|
@ -32,3 +32,7 @@ func (this *AdaptiveWriter) Write(buffer *alloc.Buffer) error {
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *AdaptiveWriter) Release() {
|
||||||
|
this.writer = nil
|
||||||
|
}
|
||||||
|
|
|
@ -50,6 +50,11 @@ func (reader *TimeOutReader) SetTimeOut(value int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (reader *TimeOutReader) Release() {
|
||||||
|
reader.connection = nil
|
||||||
|
reader.worker = nil
|
||||||
|
}
|
||||||
|
|
||||||
type timedReaderWorker struct {
|
type timedReaderWorker struct {
|
||||||
timeout int
|
timeout int
|
||||||
connection net.Conn
|
connection net.Conn
|
||||||
|
|
|
@ -57,3 +57,7 @@ func GetUserSettings(level UserLevel) UserSettings {
|
||||||
}
|
}
|
||||||
return settings
|
return settings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Account interface {
|
||||||
|
CryptionKey() []byte
|
||||||
|
}
|
||||||
|
|
|
@ -118,8 +118,11 @@ func (this *VMessInboundHandler) HandleConnection(connection *hub.TCPConn) {
|
||||||
defer connection.Close()
|
defer connection.Close()
|
||||||
|
|
||||||
connReader := v2net.NewTimeOutReader(16, connection)
|
connReader := v2net.NewTimeOutReader(16, connection)
|
||||||
|
defer connReader.Release()
|
||||||
|
|
||||||
reader := v2io.NewBufferedReader(connReader)
|
reader := v2io.NewBufferedReader(connReader)
|
||||||
|
defer reader.Release()
|
||||||
|
|
||||||
session := raw.NewServerSession(this.clients)
|
session := raw.NewServerSession(this.clients)
|
||||||
|
|
||||||
request, err := session.DecodeRequestHeader(reader)
|
request, err := session.DecodeRequestHeader(reader)
|
||||||
|
@ -145,7 +148,8 @@ func (this *VMessInboundHandler) HandleConnection(connection *hub.TCPConn) {
|
||||||
defer close(input)
|
defer close(input)
|
||||||
defer readFinish.Unlock()
|
defer readFinish.Unlock()
|
||||||
bodyReader := session.DecodeRequestBody(reader)
|
bodyReader := session.DecodeRequestBody(reader)
|
||||||
var requestReader v2io.Reader
|
var requestReader v2io.ReleasableReader
|
||||||
|
defer requestReader.Release()
|
||||||
if request.Option.IsChunkStream() {
|
if request.Option.IsChunkStream() {
|
||||||
requestReader = vmessio.NewAuthChunkReader(bodyReader)
|
requestReader = vmessio.NewAuthChunkReader(bodyReader)
|
||||||
} else {
|
} else {
|
||||||
|
@ -155,6 +159,7 @@ func (this *VMessInboundHandler) HandleConnection(connection *hub.TCPConn) {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
writer := v2io.NewBufferedWriter(connection)
|
writer := v2io.NewBufferedWriter(connection)
|
||||||
|
defer writer.Release()
|
||||||
|
|
||||||
response := &proto.ResponseHeader{
|
response := &proto.ResponseHeader{
|
||||||
Command: this.generateCommand(request),
|
Command: this.generateCommand(request),
|
||||||
|
|
|
@ -44,3 +44,7 @@ func (this *AuthChunkReader) Read() (*alloc.Buffer, error) {
|
||||||
buffer.SliceFrom(4)
|
buffer.SliceFrom(4)
|
||||||
return buffer, nil
|
return buffer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *AuthChunkReader) Release() {
|
||||||
|
this.reader = nil
|
||||||
|
}
|
||||||
|
|
|
@ -23,6 +23,10 @@ func (this *AuthChunkWriter) Write(buffer *alloc.Buffer) error {
|
||||||
return this.writer.Write(buffer)
|
return this.writer.Write(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *AuthChunkWriter) Release() {
|
||||||
|
this.writer = nil
|
||||||
|
}
|
||||||
|
|
||||||
func Authenticate(buffer *alloc.Buffer) {
|
func Authenticate(buffer *alloc.Buffer) {
|
||||||
fnvHash := fnv.New32a()
|
fnvHash := fnv.New32a()
|
||||||
fnvHash.Write(buffer.Value)
|
fnvHash.Write(buffer.Value)
|
||||||
|
|
|
@ -16,7 +16,6 @@ var (
|
||||||
type TCPConn struct {
|
type TCPConn struct {
|
||||||
conn *net.TCPConn
|
conn *net.TCPConn
|
||||||
listener *TCPHub
|
listener *TCPHub
|
||||||
dirty bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *TCPConn) Read(b []byte) (int, error) {
|
func (this *TCPConn) Read(b []byte) (int, error) {
|
||||||
|
@ -38,8 +37,6 @@ func (this *TCPConn) Close() error {
|
||||||
return ErrorClosedConnection
|
return ErrorClosedConnection
|
||||||
}
|
}
|
||||||
err := this.conn.Close()
|
err := this.conn.Close()
|
||||||
this.conn = nil
|
|
||||||
this.listener = nil
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,11 +45,9 @@ func (this *TCPConn) Release() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if this.dirty {
|
this.Close()
|
||||||
this.Close()
|
this.conn = nil
|
||||||
return
|
this.listener = nil
|
||||||
}
|
|
||||||
this.listener.recycle(this.conn)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *TCPConn) LocalAddr() net.Addr {
|
func (this *TCPConn) LocalAddr() net.Addr {
|
||||||
|
|
Loading…
Reference in New Issue