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  }