chore: packet deadline support CreateReadWaiter interface
This commit is contained in:
@@ -3,6 +3,7 @@ package deadline
|
||||
import (
|
||||
"net"
|
||||
"os"
|
||||
"runtime"
|
||||
|
||||
"github.com/Dreamacro/clash/common/net/packet"
|
||||
)
|
||||
@@ -19,7 +20,10 @@ func NewEnhancePacketConn(pc packet.EnhancePacketConn) packet.EnhancePacketConn
|
||||
}
|
||||
|
||||
type enhanceReadResult struct {
|
||||
put func()
|
||||
data []byte
|
||||
put func()
|
||||
addr net.Addr
|
||||
err error
|
||||
}
|
||||
|
||||
type enhancePacketConn struct {
|
||||
@@ -28,21 +32,29 @@ type enhancePacketConn struct {
|
||||
}
|
||||
|
||||
func (c *enhancePacketConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, err error) {
|
||||
select {
|
||||
case result := <-c.netPacketConn.resultCh:
|
||||
if result != nil {
|
||||
data = result.data
|
||||
put = result.put
|
||||
addr = result.addr
|
||||
err = result.err
|
||||
c.netPacketConn.resultCh <- nil // finish cache read
|
||||
return
|
||||
} else {
|
||||
c.netPacketConn.resultCh <- nil
|
||||
break
|
||||
FOR:
|
||||
for {
|
||||
select {
|
||||
case result := <-c.netPacketConn.resultCh:
|
||||
if result != nil {
|
||||
if result, ok := result.(*enhanceReadResult); ok {
|
||||
data = result.data
|
||||
put = result.put
|
||||
addr = result.addr
|
||||
err = result.err
|
||||
c.netPacketConn.resultCh <- nil // finish cache read
|
||||
return
|
||||
}
|
||||
c.netPacketConn.resultCh <- result // another type of read
|
||||
runtime.Gosched() // allowing other goroutines to run
|
||||
continue FOR
|
||||
} else {
|
||||
c.netPacketConn.resultCh <- nil
|
||||
break FOR
|
||||
}
|
||||
case <-c.netPacketConn.pipeDeadline.wait():
|
||||
return nil, nil, nil, os.ErrDeadlineExceeded
|
||||
}
|
||||
case <-c.netPacketConn.pipeDeadline.wait():
|
||||
return nil, nil, nil, os.ErrDeadlineExceeded
|
||||
}
|
||||
|
||||
if c.netPacketConn.disablePipe.Load() {
|
||||
@@ -62,12 +74,10 @@ func (c *enhancePacketConn) WaitReadFrom() (data []byte, put func(), addr net.Ad
|
||||
|
||||
func (c *enhancePacketConn) pipeWaitReadFrom() {
|
||||
data, put, addr, err := c.enhancePacketConn.WaitReadFrom()
|
||||
c.netPacketConn.resultCh <- &readResult{
|
||||
data: data,
|
||||
enhanceReadResult: enhanceReadResult{
|
||||
put: put,
|
||||
},
|
||||
addr: addr,
|
||||
err: err,
|
||||
}
|
||||
result := &enhanceReadResult{}
|
||||
result.data = data
|
||||
result.put = put
|
||||
result.addr = addr
|
||||
result.err = err
|
||||
c.netPacketConn.resultCh <- result
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user