mirror of https://github.com/golang/go.git
syscall: avoid convT2I allocs for ERROR_IO_PENDING instead of WSAEINPROGRESS
CL 28484 mistakenly assumed that WSARecv returns WSAEINPROGRESS when there is nothing to read. But the error is ERROR_IO_PENDING. Fix that mistake. I was about to write a test for it. But I have found TestTCPReadWriteAllocs in net package that does nearly what I need, but was conveniently disabled. So enable and extend the test. Fixes #16988 Change-Id: I55e5cf8998a9cf29e92b398d702280bdf7d6fc85 Reviewed-on: https://go-review.googlesource.com/28990 Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
f15915af4e
commit
fca3dd3718
|
|
@ -460,11 +460,9 @@ func TestTCPConcurrentAccept(t *testing.T) {
|
|||
|
||||
func TestTCPReadWriteAllocs(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "nacl", "windows":
|
||||
case "nacl":
|
||||
// NaCl needs to allocate pseudo file descriptor
|
||||
// stuff. See syscall/fd_nacl.go.
|
||||
// Windows uses closures and channels for IO
|
||||
// completion port-based netpoll. See fd_windows.go.
|
||||
t.Skipf("not supported on %s", runtime.GOOS)
|
||||
}
|
||||
|
||||
|
|
@ -474,7 +472,7 @@ func TestTCPReadWriteAllocs(t *testing.T) {
|
|||
}
|
||||
defer ln.Close()
|
||||
var server Conn
|
||||
errc := make(chan error)
|
||||
errc := make(chan error, 1)
|
||||
go func() {
|
||||
var err error
|
||||
server, err = ln.Accept()
|
||||
|
|
@ -489,6 +487,7 @@ func TestTCPReadWriteAllocs(t *testing.T) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
defer server.Close()
|
||||
|
||||
var buf [128]byte
|
||||
allocs := testing.AllocsPerRun(1000, func() {
|
||||
_, err := server.Write(buf[:])
|
||||
|
|
@ -503,6 +502,28 @@ func TestTCPReadWriteAllocs(t *testing.T) {
|
|||
if allocs > 0 {
|
||||
t.Fatalf("got %v; want 0", allocs)
|
||||
}
|
||||
|
||||
var bufwrt [128]byte
|
||||
ch := make(chan bool)
|
||||
defer close(ch)
|
||||
go func() {
|
||||
for <-ch {
|
||||
_, err := server.Write(bufwrt[:])
|
||||
errc <- err
|
||||
}
|
||||
}()
|
||||
allocs = testing.AllocsPerRun(1000, func() {
|
||||
ch <- true
|
||||
if _, err = io.ReadFull(client, buf[:]); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := <-errc; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
if allocs > 0 {
|
||||
t.Fatalf("got %v; want 0", allocs)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTCPStress(t *testing.T) {
|
||||
|
|
|
|||
|
|
@ -831,12 +831,8 @@ var _ unsafe.Pointer
|
|||
|
||||
// Do the interface allocations only once for common
|
||||
// Errno values.
|
||||
const (
|
||||
errnoWSAEINPROGRESS = 10036
|
||||
)
|
||||
|
||||
var (
|
||||
errWSAEINPROGRESS error = {{syscalldot}}Errno(errnoWSAEINPROGRESS)
|
||||
errERROR_IO_PENDING error = {{syscalldot}}Errno(ERROR_IO_PENDING)
|
||||
)
|
||||
|
||||
// errnoErr returns common boxed Errno values, to prevent
|
||||
|
|
@ -845,8 +841,8 @@ func errnoErr(e {{syscalldot}}Errno) error {
|
|||
switch e {
|
||||
case 0:
|
||||
return nil
|
||||
case errnoWSAEINPROGRESS:
|
||||
return errWSAEINPROGRESS
|
||||
case ERROR_IO_PENDING:
|
||||
return errERROR_IO_PENDING
|
||||
}
|
||||
// TODO: add more here, after collecting data on the common
|
||||
// error values see on Windows. (perhaps when running
|
||||
|
|
|
|||
|
|
@ -11,12 +11,8 @@ var _ unsafe.Pointer
|
|||
|
||||
// Do the interface allocations only once for common
|
||||
// Errno values.
|
||||
const (
|
||||
errnoWSAEINPROGRESS = 10036
|
||||
)
|
||||
|
||||
var (
|
||||
errWSAEINPROGRESS error = Errno(errnoWSAEINPROGRESS)
|
||||
errERROR_IO_PENDING error = Errno(ERROR_IO_PENDING)
|
||||
)
|
||||
|
||||
// errnoErr returns common boxed Errno values, to prevent
|
||||
|
|
@ -25,8 +21,8 @@ func errnoErr(e Errno) error {
|
|||
switch e {
|
||||
case 0:
|
||||
return nil
|
||||
case errnoWSAEINPROGRESS:
|
||||
return errWSAEINPROGRESS
|
||||
case ERROR_IO_PENDING:
|
||||
return errERROR_IO_PENDING
|
||||
}
|
||||
// TODO: add more here, after collecting data on the common
|
||||
// error values see on Windows. (perhaps when running
|
||||
|
|
|
|||
Loading…
Reference in New Issue