From: Alex Brainman Date: Sun, 30 Apr 2017 08:21:16 +0000 (+1000) Subject: internal/poll: remove allocation in windows FD.Writev X-Git-Tag: go1.9beta1~317 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ddcb975ffc05f4b41b063beb5613081fd081fce1;p=gostls13.git internal/poll: remove allocation in windows FD.Writev Use closure parameter instead of external variable to remove 1 allocation. I tried to add test, but it is difficult to add something simple and not flake here. I did test this with: diff --git a/src/net/writev_test.go b/src/net/writev_test.go index 4c05be4..e417d68 100644 --- a/src/net/writev_test.go +++ b/src/net/writev_test.go @@ -99,6 +99,15 @@ func TestBuffers_WriteTo(t *testing.T) { } } +func TestBuffers_WriteToAllocs(t *testing.T) { + allocs := testing.AllocsPerRun(10, func() { + testBuffer_writeTo(t, 10, false) + }) + if allocs > 0 { + t.Fatalf("got %v; want 0", allocs) + } +} + func testBuffer_writeTo(t *testing.T, chunks int, useCopy bool) { oldHook := poll.TestHookDidWritev defer func() { poll.TestHookDidWritev = oldHook }() It makes allocation count go down by 1 after the fix. Before: C:\>u:\test -test.v -test.run=WriteToAllocs === RUN TestBuffers_WriteToAllocs --- FAIL: TestBuffers_WriteToAllocs (0.05s) writev_test.go:107: got 66; want 0 FAIL and after: C:\>u:\test -test.v -test.run=WriteToAllocs === RUN TestBuffers_WriteToAllocs --- FAIL: TestBuffers_WriteToAllocs (0.04s) writev_test.go:107: got 65; want 0 FAIL Thanks to @MichaelMonashev for report and the fix. Fixes #19222 Change-Id: I0f73cd9e2c8bbaa0653083f81f3ccb83b5ea84e1 Reviewed-on: https://go-review.googlesource.com/42893 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index d312cfed7e..e212f38ff1 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -686,7 +686,7 @@ func (fd *FD) Writev(buf *[][]byte) (int64, error) { o := &fd.wop o.InitBufs(buf) n, err := wsrv.ExecIO(o, "WSASend", func(o *operation) error { - return syscall.WSASend(o.fd.Sysfd, &o.bufs[0], uint32(len(*buf)), &o.qty, 0, &o.o, nil) + return syscall.WSASend(o.fd.Sysfd, &o.bufs[0], uint32(len(o.bufs)), &o.qty, 0, &o.o, nil) }) o.ClearBufs() TestHookDidWritev(n)