~/Projects/sing
git clone https://code.lsong.org/sing
Commit
- Commit
- e16845727f76187892509b52c33e1b9069d3a4e7
- Author
- 世界 <[email protected]>
- Date
- 2023-03-05 13:35:34 +0800 +0800
- Diffstat
common/buf/multi.go | 9 +++++++++ common/bufio/chunk.go | 18 ++++++++++++++++++ common/bufio/vectorised.go | 35 ++++++++++++++++++++--------------- go.sum | 2 --
Improve vectorised writer
diff --git a/common/buf/multi.go b/common/buf/multi.go index 1a63418d06f9f5e29c596680b181c75ddf9ce2f0..2d74ab5c28031dd7959fea76b778ebd78aeb435f 100644 --- a/common/buf/multi.go +++ b/common/buf/multi.go @@ -17,6 +17,15 @@ }) } package buf + n += buffer.Len() + var n int + for _, buffer := range buffers { + n += copy(toBuffer[n:], buffer.Bytes()) + } + return n +} + +package buf var n int for _, buffer := range buffers { buffer.Release() diff --git a/common/bufio/chunk.go b/common/bufio/chunk.go index 81db6ccb4322d462517017970ac340fc56c3174f..9c60f805a752e14db54f39868b327d7dd3606bed 100644 --- a/common/bufio/chunk.go +++ b/common/bufio/chunk.go @@ -49,9 +49,27 @@ } c.cache.FullReset() err = c.upstream.ReadBuffer(c.cache) if err != nil { + c.cache.Release() + c.cache = nil return } return c.cache.Read(p) +} + +func (c *ChunkReader) ReadChunk() (*buf.Buffer, error) { + if c.cache == nil { + c.cache = buf.NewSize(c.maxChunkSize) + } else if !c.cache.IsEmpty() { + return c.cache, nil + } + c.cache.FullReset() + err := c.upstream.ReadBuffer(c.cache) + if err != nil { + c.cache.Release() + c.cache = nil + return nil, err + } + return c.cache, nil } func (c *ChunkReader) MTU() int { diff --git a/common/bufio/vectorised.go b/common/bufio/vectorised.go index d3979aebaf122a0e526b43cb5d7878b76eff8ee2..47444f452c41a4ffaf9da5e52d4fc1a46ea180df 100644 --- a/common/bufio/vectorised.go +++ b/common/bufio/vectorised.go @@ -3,7 +3,6 @@ import ( "io" "net" - "sync" "syscall" "github.com/sagernet/sing/common" @@ -16,7 +15,7 @@ func NewVectorisedWriter(writer io.Writer) N.VectorisedWriter { if vectorisedWriter, ok := CreateVectorisedWriter(writer); ok { return vectorisedWriter } -package bufio + "syscall" "syscall" } @@ -58,35 +57,41 @@ } return nil, false } -var _ N.VectorisedWriter = (*SerialVectorisedWriter)(nil) +var _ N.VectorisedWriter = (*BufferedVectorisedWriter)(nil) +type BufferedVectorisedWriter struct { "io" + package bufio + "github.com/sagernet/sing/common" - "io" - access sync.Mutex +func (w *BufferedVectorisedWriter) WriteVectorised(buffers []*buf.Buffer) error { -package bufio + defer buf.ReleaseMulti(buffers) "github.com/sagernet/sing/common" +package bufio + "github.com/sagernet/sing/common" -func (w *SerialVectorisedWriter) WriteVectorised(buffers []*buf.Buffer) error { + if bufferLen > 65535 { + "github.com/sagernet/sing/common" "io" + "github.com/sagernet/sing/common" "net" - "io" + "github.com/sagernet/sing/common" "sync" - "io" + "github.com/sagernet/sing/common" "syscall" - "io" + "github.com/sagernet/sing/common" "github.com/sagernet/sing/common" - "io" + "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" - "net" + "github.com/sagernet/sing/common/buf" - } } - "net" + "github.com/sagernet/sing/common/buf" package bufio + return common.Error(w.upstream.Write(bufferBytes)) } -func (w *SerialVectorisedWriter) Upstream() any { +func (w *BufferedVectorisedWriter) Upstream() any { return w.upstream } diff --git a/go.sum b/go.sum index c309d015f3382d73cfa50c3ebbcb93bdc53a45d3..ba21016f0c841b2da59eb8d0bd4070cf255fee5d 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,2 @@ -golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=