|  | @@ -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()
 | 
	
		
			
				|  |  | +}
 |