race.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package debugio
  2. import (
  3. "net"
  4. "sync"
  5. "github.com/sagernet/sing/common/buf"
  6. "github.com/sagernet/sing/common/bufio"
  7. N "github.com/sagernet/sing/common/network"
  8. )
  9. type RaceConn struct {
  10. N.ExtendedConn
  11. readAccess sync.Mutex
  12. writeAccess sync.Mutex
  13. }
  14. func NewRaceConn(conn net.Conn) N.ExtendedConn {
  15. return &RaceConn{ExtendedConn: bufio.NewExtendedConn(conn)}
  16. }
  17. func (c *RaceConn) Read(p []byte) (n int, err error) {
  18. c.readAccess.Lock()
  19. defer c.readAccess.Unlock()
  20. return c.ExtendedConn.Read(p)
  21. }
  22. func (c *RaceConn) Write(p []byte) (n int, err error) {
  23. c.writeAccess.Lock()
  24. defer c.writeAccess.Unlock()
  25. return c.ExtendedConn.Write(p)
  26. }
  27. func (c *RaceConn) ReadBuffer(buffer *buf.Buffer) error {
  28. c.readAccess.Lock()
  29. defer c.readAccess.Unlock()
  30. return c.ExtendedConn.ReadBuffer(buffer)
  31. }
  32. func (c *RaceConn) WriteBuffer(buffer *buf.Buffer) error {
  33. c.writeAccess.Lock()
  34. defer c.writeAccess.Unlock()
  35. return c.ExtendedConn.WriteBuffer(buffer)
  36. }
  37. func (c *RaceConn) Upstream() any {
  38. return c.ExtendedConn
  39. }