github.com/kelleygo/clashcore@v1.0.2/common/net/packet/ref.go (about) 1 package packet 2 3 import ( 4 "net" 5 "runtime" 6 "time" 7 ) 8 9 type refPacketConn struct { 10 pc EnhancePacketConn 11 ref any 12 } 13 14 func (c *refPacketConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, err error) { 15 defer runtime.KeepAlive(c.ref) 16 return c.pc.WaitReadFrom() 17 } 18 19 func (c *refPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { 20 defer runtime.KeepAlive(c.ref) 21 return c.pc.ReadFrom(p) 22 } 23 24 func (c *refPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { 25 defer runtime.KeepAlive(c.ref) 26 return c.pc.WriteTo(p, addr) 27 } 28 29 func (c *refPacketConn) Close() error { 30 defer runtime.KeepAlive(c.ref) 31 return c.pc.Close() 32 } 33 34 func (c *refPacketConn) LocalAddr() net.Addr { 35 defer runtime.KeepAlive(c.ref) 36 return c.pc.LocalAddr() 37 } 38 39 func (c *refPacketConn) SetDeadline(t time.Time) error { 40 defer runtime.KeepAlive(c.ref) 41 return c.pc.SetDeadline(t) 42 } 43 44 func (c *refPacketConn) SetReadDeadline(t time.Time) error { 45 defer runtime.KeepAlive(c.ref) 46 return c.pc.SetReadDeadline(t) 47 } 48 49 func (c *refPacketConn) SetWriteDeadline(t time.Time) error { 50 defer runtime.KeepAlive(c.ref) 51 return c.pc.SetWriteDeadline(t) 52 } 53 54 func (c *refPacketConn) Upstream() any { 55 return c.pc 56 } 57 58 func (c *refPacketConn) ReaderReplaceable() bool { // Relay() will handle reference 59 return true 60 } 61 62 func (c *refPacketConn) WriterReplaceable() bool { // Relay() will handle reference 63 return true 64 } 65 66 func NewRefPacketConn(pc net.PacketConn, ref any) EnhancePacketConn { 67 rPC := &refPacketConn{pc: NewEnhancePacketConn(pc), ref: ref} 68 if singPC, isSingPC := pc.(SingPacketConn); isSingPC { 69 return &refSingPacketConn{ 70 refPacketConn: rPC, 71 singPacketConn: singPC, 72 } 73 } 74 return rPC 75 }