d118bcc717
- `timeoutconn` handles state, yet calls to Read/Write make a copy of
that state (non-pointer receiver) so any outbound calls will not have
the state updated
- Even without the copy issue, the renew methods can in edge cases set a
new deadline _after_ DisableTimeouts have been called, consider the
following racy behavior:
1. `renewReadDeadline` is called, checks `renewDeadlinesDisabled`
(not disabled)
2. `DisableTimeouts` is called, sets `renewDeadlinesDisabled`
3. `DisableTimeouts` invokes `c.SetDeadline`
4. `renewReadDeadline` invokes `c.SetReadDeadline`
To fix the above, the `Conn` receiver was made to be a pointer
everywhere and access to renewDeadlinesDisabled is now guarded
by an RWMutex instead of using atomics.
closes #415
12 lines
276 B
Go
12 lines
276 B
Go
// +build illumos solaris
|
|
|
|
package timeoutconn
|
|
|
|
import "net"
|
|
|
|
func (c *Conn) readv(buffers net.Buffers) (n int64, err error) {
|
|
// Go does not expose the SYS_READV symbol for Solaris / Illumos - do they have it?
|
|
// Anyhow, use the fallback
|
|
return c.readvFallback(buffers)
|
|
}
|