fix: sing-based listener panic
This commit is contained in:
@ -37,9 +37,9 @@ func (c *bindPacketConn) Upstream() any {
|
||||
return c.EnhancePacketConn
|
||||
}
|
||||
|
||||
func NewBindPacketConn(pc EnhancePacketConn, rAddr net.Addr) net.Conn {
|
||||
func NewBindPacketConn(pc net.PacketConn, rAddr net.Addr) net.Conn {
|
||||
return &bindPacketConn{
|
||||
EnhancePacketConn: pc,
|
||||
EnhancePacketConn: NewEnhancePacketConn(pc),
|
||||
rAddr: rAddr,
|
||||
}
|
||||
}
|
||||
|
@ -15,20 +15,24 @@ var NewDeadlinePacketConn = deadline.NewPacketConn
|
||||
var NewDeadlineEnhancePacketConn = deadline.NewEnhancePacketConn
|
||||
|
||||
type threadSafePacketConn struct {
|
||||
net.PacketConn
|
||||
EnhancePacketConn
|
||||
access sync.Mutex
|
||||
}
|
||||
|
||||
func (c *threadSafePacketConn) WriteTo(b []byte, addr net.Addr) (int, error) {
|
||||
c.access.Lock()
|
||||
defer c.access.Unlock()
|
||||
return c.PacketConn.WriteTo(b, addr)
|
||||
return c.EnhancePacketConn.WriteTo(b, addr)
|
||||
}
|
||||
|
||||
func (c *threadSafePacketConn) Upstream() any {
|
||||
return c.PacketConn
|
||||
return c.EnhancePacketConn
|
||||
}
|
||||
|
||||
func (c *threadSafePacketConn) ReaderReplaceable() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func NewThreadSafePacketConn(pc net.PacketConn) net.PacketConn {
|
||||
return &threadSafePacketConn{PacketConn: pc}
|
||||
return &threadSafePacketConn{EnhancePacketConn: NewEnhancePacketConn(pc)}
|
||||
}
|
||||
|
@ -82,10 +82,15 @@ func NewRefConn(conn net.Conn, ref any) net.Conn {
|
||||
}
|
||||
|
||||
type refPacketConn struct {
|
||||
pc net.PacketConn
|
||||
pc EnhancePacketConn
|
||||
ref any
|
||||
}
|
||||
|
||||
func (pc *refPacketConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, err error) {
|
||||
defer runtime.KeepAlive(pc.ref)
|
||||
return pc.pc.WaitReadFrom()
|
||||
}
|
||||
|
||||
func (pc *refPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
|
||||
defer runtime.KeepAlive(pc.ref)
|
||||
return pc.pc.ReadFrom(p)
|
||||
@ -121,6 +126,18 @@ func (pc *refPacketConn) SetWriteDeadline(t time.Time) error {
|
||||
return pc.pc.SetWriteDeadline(t)
|
||||
}
|
||||
|
||||
func NewRefPacketConn(pc net.PacketConn, ref any) net.PacketConn {
|
||||
return &refPacketConn{pc: pc, ref: ref}
|
||||
func (pc *refPacketConn) Upstream() any {
|
||||
return pc.pc
|
||||
}
|
||||
|
||||
func (pc *refPacketConn) ReaderReplaceable() bool { // Relay() will handle reference
|
||||
return true
|
||||
}
|
||||
|
||||
func (pc *refPacketConn) WriterReplaceable() bool { // Relay() will handle reference
|
||||
return true
|
||||
}
|
||||
|
||||
func NewRefPacketConn(pc net.PacketConn, ref any) net.PacketConn {
|
||||
return &refPacketConn{pc: NewEnhancePacketConn(pc), ref: ref}
|
||||
}
|
||||
|
Reference in New Issue
Block a user