1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-11-04 17:27:23 -05:00

Save 1 allocation in shadowsocks

This commit is contained in:
v2ray 2016-01-31 21:37:00 +01:00
parent 97a85f04ce
commit 6c7a9586d0
2 changed files with 22 additions and 19 deletions

View File

@ -63,13 +63,8 @@ func (b *Buffer) Append(data []byte) *Buffer {
// Prepend prepends bytes in front of the buffer. Caller must ensure total bytes prepended is // Prepend prepends bytes in front of the buffer. Caller must ensure total bytes prepended is
// no more than 16 bytes. // no more than 16 bytes.
func (b *Buffer) Prepend(data []byte) *Buffer { func (b *Buffer) Prepend(data []byte) *Buffer {
newoffset := b.offset - len(data) b.SliceBack(len(data))
if newoffset < 0 { copy(b.Value, data)
newoffset = 0
}
copy(b.head[newoffset:], data)
b.Value = b.head[newoffset : b.offset+len(b.Value)]
b.offset = newoffset
return b return b
} }
@ -89,6 +84,16 @@ func (b *Buffer) SliceFrom(from int) *Buffer {
return b return b
} }
func (b *Buffer) SliceBack(offset int) *Buffer {
newoffset := b.offset - offset
if newoffset < 0 {
newoffset = 0
}
b.Value = b.head[newoffset : b.offset+len(b.Value)]
b.offset = newoffset
return b
}
// Len returns the length of the buffer content. // Len returns the length of the buffer content.
func (b *Buffer) Len() int { func (b *Buffer) Len() int {
return len(b.Value) return len(b.Value)

View File

@ -187,20 +187,18 @@ func (this *Shadowsocks) handleConnection(conn *hub.TCPConn) {
var writeFinish sync.Mutex var writeFinish sync.Mutex
writeFinish.Lock() writeFinish.Lock()
go func() { go func() {
firstChunk := alloc.NewBuffer().Slice(0, this.config.Cipher.IVSize())
defer firstChunk.Release()
writer, err := this.config.Cipher.NewEncodingStream(key, firstChunk.Value, conn)
if err != nil {
log.Error("Shadowsocks: Failed to create encoding stream: ", err)
return
}
if payload, ok := <-ray.InboundOutput(); ok { if payload, ok := <-ray.InboundOutput(); ok {
firstChunk.Append(payload.Value) payload.SliceBack(16)
payload.Release() rand.Read(payload.Value[:16])
writer.Write(firstChunk.Value) writer, err := this.config.Cipher.NewEncodingStream(key, payload.Value[:16], conn)
if err != nil {
log.Error("Shadowsocks: Failed to create encoding stream: ", err)
return
}
writer.Write(payload.Value)
payload.Release()
v2io.ChanToWriter(writer, ray.InboundOutput()) v2io.ChanToWriter(writer, ray.InboundOutput())
} }
writeFinish.Unlock() writeFinish.Unlock()