Explorar o código

segment writer

v2ray %!s(int64=9) %!d(string=hai) anos
pai
achega
41b230994e
Modificáronse 1 ficheiros con 54 adicións e 0 borrados
  1. 54 0
      transport/internet/kcp/output.go

+ 54 - 0
transport/internet/kcp/output.go

@@ -0,0 +1,54 @@
+package kcp
+
+import (
+	"sync"
+
+	"github.com/v2ray/v2ray-core/common/alloc"
+	v2io "github.com/v2ray/v2ray-core/common/io"
+)
+
+type SegmentWriter struct {
+	sync.Mutex
+	mtu    uint32
+	buffer *alloc.Buffer
+	writer v2io.Writer
+}
+
+func NewSegmentWriter(mtu uint32, writer v2io.Writer) *SegmentWriter {
+	return &SegmentWriter{
+		mtu:    mtu,
+		writer: writer,
+	}
+}
+
+func (this *SegmentWriter) Write(seg ISegment) {
+	this.Lock()
+	defer this.Unlock()
+
+	nBytes := seg.ByteSize()
+	if uint32(this.buffer.Len()+nBytes) > this.mtu {
+		this.FlushWithoutLock()
+	}
+
+	if this.buffer == nil {
+		this.buffer = alloc.NewSmallBuffer().Clear()
+	}
+
+	this.buffer.Value = seg.Bytes(this.buffer.Value)
+}
+
+func (this *SegmentWriter) FlushWithoutLock() {
+	this.writer.Write(this.buffer)
+	this.buffer = nil
+}
+
+func (this *SegmentWriter) Flush() {
+	this.Lock()
+	defer this.Unlock()
+
+	if this.buffer.Len() == 0 {
+		return
+	}
+
+	this.FlushWithoutLock()
+}