Liu Song’s Projects


~/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=