]> Cypherpunks repositories - gostls13.git/commitdiff
internal/poll: remove allocation in windows FD.Writev
authorAlex Brainman <alex.brainman@gmail.com>
Sun, 30 Apr 2017 08:21:16 +0000 (18:21 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Mon, 8 May 2017 01:50:49 +0000 (01:50 +0000)
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 <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/internal/poll/fd_windows.go

index d312cfed7e9338586f67399c2e1fb26b2a88ec37..e212f38ff103717bc3ca05464c3e474f8c0a0266 100644 (file)
@@ -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)