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