mirror of https://github.com/jackc/pgx.git
Avoid allocations with non-blocking write
parent
6b63ceee07
commit
95a43139c7
|
@ -62,6 +62,11 @@ type NetConn struct {
|
||||||
writeQueue bufferQueue
|
writeQueue bufferQueue
|
||||||
|
|
||||||
readFlushLock sync.Mutex
|
readFlushLock sync.Mutex
|
||||||
|
// non-blocking writes with syscall.RawConn are done with a callback function. By using these fields instead of the
|
||||||
|
// callback functions closure to pass the buf argument and receive the n and err results we avoid some allocations.
|
||||||
|
nonblockWriteBuf []byte
|
||||||
|
nonblockWriteErr error
|
||||||
|
nonblockWriteN int
|
||||||
|
|
||||||
readDeadlineLock sync.Mutex
|
readDeadlineLock sync.Mutex
|
||||||
readDeadline time.Time
|
readDeadline time.Time
|
||||||
|
@ -367,17 +372,21 @@ func (c *NetConn) fakeNonblockingWrite(b []byte) (n int, err error) {
|
||||||
return c.conn.Write(b)
|
return c.conn.Write(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// realNonblockingWrite does a non-blocking write. readFlushLock must already be held.
|
||||||
func (c *NetConn) realNonblockingWrite(b []byte) (n int, err error) {
|
func (c *NetConn) realNonblockingWrite(b []byte) (n int, err error) {
|
||||||
var funcErr error
|
c.nonblockWriteBuf = b
|
||||||
|
c.nonblockWriteN = 0
|
||||||
|
c.nonblockWriteErr = nil
|
||||||
err = c.rawConn.Write(func(fd uintptr) (done bool) {
|
err = c.rawConn.Write(func(fd uintptr) (done bool) {
|
||||||
n, funcErr = syscall.Write(int(fd), b)
|
c.nonblockWriteN, c.nonblockWriteErr = syscall.Write(int(fd), c.nonblockWriteBuf)
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
if err == nil && funcErr != nil {
|
n = c.nonblockWriteN
|
||||||
if errors.Is(funcErr, syscall.EWOULDBLOCK) {
|
if err == nil && c.nonblockWriteErr != nil {
|
||||||
|
if errors.Is(c.nonblockWriteErr, syscall.EWOULDBLOCK) {
|
||||||
err = ErrWouldBlock
|
err = ErrWouldBlock
|
||||||
} else {
|
} else {
|
||||||
err = funcErr
|
err = c.nonblockWriteErr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue