Use []byte in pool instead of buffer

This commit is contained in:
V2Ray
2015-10-08 17:41:38 +02:00
parent 472cf7f523
commit 3cb1951dfc
8 changed files with 38 additions and 44 deletions
-2
View File
@@ -36,7 +36,6 @@ func (vconn *FreedomConnection) Dispatch(firstPacket v2net.Packet, ray core.Outb
if chunk := firstPacket.Chunk(); chunk != nil {
conn.Write(chunk.Value)
chunk.Release()
chunk = nil
}
if !firstPacket.MoreChunks() {
@@ -74,7 +73,6 @@ func dumpOutput(conn net.Conn, output chan<- *alloc.Buffer, finish *sync.Mutex,
output <- response
} else {
response.Release()
response = nil
}
if err != nil {
return
+4 -2
View File
@@ -40,22 +40,25 @@ func (server *SocksServer) getUDPAddr() v2net.Address {
func (server *SocksServer) AcceptPackets(conn *net.UDPConn) error {
for {
buffer := alloc.NewBuffer()
defer buffer.Release()
nBytes, addr, err := conn.ReadFromUDP(buffer.Value)
if err != nil {
log.Error("Socks failed to read UDP packets: %v", err)
buffer.Release()
continue
}
buffer.Slice(0, nBytes)
log.Info("Client UDP connection from %v", addr)
request, err := protocol.ReadUDPRequest(buffer.Value)
buffer.Release()
if err != nil {
log.Error("Socks failed to parse UDP request: %v", err)
request.Data.Release()
continue
}
if request.Fragment != 0 {
log.Warning("Dropping framented UDP packets.")
// TODO handle fragments
request.Data.Release()
continue
}
@@ -79,7 +82,6 @@ func (server *SocksServer) handlePacket(conn *net.UDPConn, packet v2net.Packet,
udpMessage := response.Bytes(nil)
nBytes, err := conn.WriteToUDP(udpMessage, clientAddr)
response.Data.Release()
response.Data = nil
if err != nil {
log.Error("Socks failed to write UDP message (%d bytes) to %s: %v", nBytes, clientAddr.String(), err)
}
+7 -6
View File
@@ -91,14 +91,15 @@ func (handler *VMessInboundHandler) HandleConnection(connection *net.TCPConn) er
}
// Optimize for small response packet
buffer := make([]byte, 0, 4*1024)
buffer = append(buffer, request.ResponseHeader...)
buffer := alloc.NewBuffer()
buffer.Clear()
buffer.Append(request.ResponseHeader)
if data, open := <-output; open {
buffer = append(buffer, data.Value...)
data = nil
responseWriter.Write(buffer)
buffer = nil
buffer.Append(data.Value)
data.Release()
responseWriter.Write(buffer.Value)
buffer.Release()
go handleOutput(request, responseWriter, output, &writeFinish)
writeFinish.Lock()
}
+1 -1
View File
@@ -60,6 +60,7 @@ func (handler *VMessInboundHandler) AcceptPackets(conn *net.UDPConn) {
nBytes, err = cryptReader.Read(data.Value)
if err != nil {
log.Warning("VMessIn: Unable to decrypt data: %v", err)
data.Release()
continue
}
data.Slice(0, nBytes)
@@ -91,7 +92,6 @@ func (handler *VMessInboundHandler) handlePacket(conn *net.UDPConn, request *pro
hasData = true
responseWriter.Write(data.Value)
data.Release()
data = nil
}
if hasData {
-2
View File
@@ -150,11 +150,9 @@ func handleRequest(conn net.Conn, request *protocol.VMessRequest, firstPacket v2
encryptRequestWriter.Crypt(firstChunk.Value)
requestBytes = append(requestBytes, firstChunk.Value...)
firstChunk.Release()
firstChunk = nil
_, err = conn.Write(requestBytes)
buffer.Release()
buffer = nil
if err != nil {
log.Error("VMessOut: Failed to write VMess request: %v", err)
return