thread.go 763 B

123456789101112131415161718192021222324252627282930313233343536
  1. package packet
  2. import (
  3. "net"
  4. "sync"
  5. )
  6. type threadSafePacketConn struct {
  7. EnhancePacketConn
  8. access sync.Mutex
  9. }
  10. func (c *threadSafePacketConn) WriteTo(b []byte, addr net.Addr) (int, error) {
  11. c.access.Lock()
  12. defer c.access.Unlock()
  13. return c.EnhancePacketConn.WriteTo(b, addr)
  14. }
  15. func (c *threadSafePacketConn) Upstream() any {
  16. return c.EnhancePacketConn
  17. }
  18. func (c *threadSafePacketConn) ReaderReplaceable() bool {
  19. return true
  20. }
  21. func NewThreadSafePacketConn(pc net.PacketConn) EnhancePacketConn {
  22. tsPC := &threadSafePacketConn{EnhancePacketConn: NewEnhancePacketConn(pc)}
  23. if singPC, isSingPC := pc.(SingPacketConn); isSingPC {
  24. return &threadSafeSingPacketConn{
  25. threadSafePacketConn: tsPC,
  26. singPacketConn: singPC,
  27. }
  28. }
  29. return tsPC
  30. }