|  | @@ -2,11 +2,13 @@ package io
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import (
 |  |  import (
 | 
											
												
													
														|  |  	"io"
 |  |  	"io"
 | 
											
												
													
														|  | 
 |  | +	"sync"
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	"github.com/v2ray/v2ray-core/common/alloc"
 |  |  	"github.com/v2ray/v2ray-core/common/alloc"
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  type BufferedWriter struct {
 |  |  type BufferedWriter struct {
 | 
											
												
													
														|  | 
 |  | +	sync.Mutex
 | 
											
												
													
														|  |  	writer io.Writer
 |  |  	writer io.Writer
 | 
											
												
													
														|  |  	buffer *alloc.Buffer
 |  |  	buffer *alloc.Buffer
 | 
											
												
													
														|  |  	cached bool
 |  |  	cached bool
 | 
											
										
											
												
													
														|  | @@ -21,6 +23,13 @@ func NewBufferedWriter(rawWriter io.Writer) *BufferedWriter {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func (this *BufferedWriter) Write(b []byte) (int, error) {
 |  |  func (this *BufferedWriter) Write(b []byte) (int, error) {
 | 
											
												
													
														|  | 
 |  | +	this.Lock()
 | 
											
												
													
														|  | 
 |  | +	defer this.Unlock()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	if this.writer == nil {
 | 
											
												
													
														|  | 
 |  | +		return 0, io.EOF
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  	if !this.cached {
 |  |  	if !this.cached {
 | 
											
												
													
														|  |  		return this.writer.Write(b)
 |  |  		return this.writer.Write(b)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
										
											
												
													
														|  | @@ -35,6 +44,12 @@ func (this *BufferedWriter) Write(b []byte) (int, error) {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func (this *BufferedWriter) Flush() error {
 |  |  func (this *BufferedWriter) Flush() error {
 | 
											
												
													
														|  | 
 |  | +	this.Lock()
 | 
											
												
													
														|  | 
 |  | +	defer this.Unlock()
 | 
											
												
													
														|  | 
 |  | +	if this.writer == nil {
 | 
											
												
													
														|  | 
 |  | +		return io.EOF
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  	defer this.buffer.Clear()
 |  |  	defer this.buffer.Clear()
 | 
											
												
													
														|  |  	for !this.buffer.IsEmpty() {
 |  |  	for !this.buffer.IsEmpty() {
 | 
											
												
													
														|  |  		nBytes, err := this.writer.Write(this.buffer.Value)
 |  |  		nBytes, err := this.writer.Write(this.buffer.Value)
 | 
											
										
											
												
													
														|  | @@ -58,6 +73,9 @@ func (this *BufferedWriter) SetCached(cached bool) {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func (this *BufferedWriter) Release() {
 |  |  func (this *BufferedWriter) Release() {
 | 
											
												
													
														|  | 
 |  | +	this.Lock()
 | 
											
												
													
														|  | 
 |  | +	defer this.Unlock()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  	this.Flush()
 |  |  	this.Flush()
 | 
											
												
													
														|  |  	this.buffer.Release()
 |  |  	this.buffer.Release()
 | 
											
												
													
														|  |  	this.buffer = nil
 |  |  	this.buffer = nil
 |