• Alex Brainman's avatar
    internal/poll: remove allocation in windows FD.Writev · ddcb975f
    Alex Brainman authored
    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/42893Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    ddcb975f
fd_windows.go 21.4 KB