mirror of https://github.com/v2ray/v2ray-core
busy wait on writing
parent
b5f43031d4
commit
663b9c9bbc
|
@ -1,8 +1,10 @@
|
|||
package ray
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/v2ray/v2ray-core/common/alloc"
|
||||
)
|
||||
|
@ -11,6 +13,10 @@ const (
|
|||
bufferSize = 128
|
||||
)
|
||||
|
||||
var (
|
||||
ErrorIOTimeout = errors.New("IO Timeout")
|
||||
)
|
||||
|
||||
// NewRay creates a new Ray for direct traffic transport.
|
||||
func NewRay() Ray {
|
||||
return &directRay{
|
||||
|
@ -74,13 +80,26 @@ func (this *Stream) Write(data *alloc.Buffer) error {
|
|||
if this.closed {
|
||||
return io.EOF
|
||||
}
|
||||
for {
|
||||
err := this.TryWriteOnce(data)
|
||||
if err != ErrorIOTimeout {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Stream) TryWriteOnce(data *alloc.Buffer) error {
|
||||
this.access.RLock()
|
||||
defer this.access.RUnlock()
|
||||
if this.closed {
|
||||
return io.EOF
|
||||
}
|
||||
this.buffer <- data
|
||||
select {
|
||||
case this.buffer <- data:
|
||||
return nil
|
||||
case <-time.Tick(time.Second):
|
||||
return ErrorIOTimeout
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Stream) Close() {
|
||||
|
|
Loading…
Reference in New Issue