1. 05 Apr, 2016 26 commits
    • Brad Fitzpatrick's avatar
      crypto/rsa, crypto/ecdsa: fail earlier on zero parameters · d7c699d9
      Brad Fitzpatrick authored
      Change-Id: Ia6ed49d5ef3a256a55e6d4eaa1b4d9f0fc447013
      Reviewed-on: https://go-review.googlesource.com/21560Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      d7c699d9
    • Marcel van Lohuizen's avatar
      testing: improve output · 7e0d6602
      Marcel van Lohuizen authored
      This introduces a few changes
      - Skipped benchmarks now print a SKIP line, also if there was
      no output
      - The benchmark name is only printed if there the benchmark
      was not skipped or did not fail in the probe phase.
      
      It also fixes a bug of doubling a skip message in chatty mode in
      absense of a failure.
      
      The chatty flag is now passed in the common struct to allow
      for testing of the printed messages.
      
      Fixes #14799
      
      Change-Id: Ia8eb140c2e5bb467e66b8ef20a2f98f5d95415d5
      Reviewed-on: https://go-review.googlesource.com/21504Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      7e0d6602
    • Josh Bleecher Snyder's avatar
      cmd/compile: pull ssa OAPPEND expression handing into its own function · 5e1b7bde
      Josh Bleecher Snyder authored
      Pure code movement.
      
      Change-Id: Ia07ee0b0041c931b08adf090f262a6f74a6fdb01
      Reviewed-on: https://go-review.googlesource.com/21546
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      5e1b7bde
    • Josh Bleecher Snyder's avatar
      cmd/compile: give TLS relocations a name when dumping assembly · 7735dfb6
      Josh Bleecher Snyder authored
      Before:
      
      	...
      	0x00d0 ff ff ff e8 00 00 00 00 e9 23 ff ff ff cc cc cc  .........#......
      	rel 5+4 t=14 +0
      	rel 82+4 t=13 runtime.writeBarrier+0
      	...
      
      After:
      
      	...
      	0x00d0 ff ff ff e8 00 00 00 00 e9 23 ff ff ff cc cc cc  .........#......
      	rel 5+4 t=14 TLS+0
      	rel 82+4 t=13 runtime.writeBarrier+0
      	...
      
      Change-Id: Ibdaf694581b5fd5fb87fa8ce6a792f3eb4493622
      Reviewed-on: https://go-review.googlesource.com/21545Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      7735dfb6
    • Joe Tsai's avatar
      os: deprecate os.SEEK_SET, os.SEEK_CUR, and os.SEEK_END · 260ea689
      Joe Tsai authored
      CL/19862 introduced the same set of constants to the io package.
      We should steer users away from the os.SEEK* versions and towards
      the io.Seek* versions.
      
      Updates #6885
      
      Change-Id: I96ec5be3ec3439e1295c937159dadaf1ebfb2737
      Reviewed-on: https://go-review.googlesource.com/21540Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      260ea689
    • Robert Griesemer's avatar
      go/importer: match predeclared type list with gc's list in binary exporter · f79b50b8
      Robert Griesemer authored
      I think we had this code before but it may have gone lost somehow.
      
      Change-Id: Ifde490e686de0d2bfe907cbe19c9197f24f5fa8e
      Reviewed-on: https://go-review.googlesource.com/21537Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      f79b50b8
    • David Chase's avatar
      cmd/compile: note escape of parts of closured-capture vars · d8c815d8
      David Chase authored
      Missed a case for closure calls (OCALLFUNC && indirect) in
      esc.go:esccall.
      
      Cleanup to runtime code for windows to more thoroughly hide
      a technical escape.  Also made code pickier about failing
      to late non-optional kernel32.dll.
      
      Fixes #14409.
      
      Change-Id: Ie75486a2c8626c4583224e02e4872c2875f7bca5
      Reviewed-on: https://go-review.googlesource.com/20102
      Run-TryBot: David Chase <drchase@google.com>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      d8c815d8
    • Robert Griesemer's avatar
      crypto/dsa: eliminate invalid PublicKey early · eb876dd8
      Robert Griesemer authored
      For PublicKey.P == 0, Verify will fail. Don't even try.
      
      Change-Id: I1009f2b3dead8d0041626c946633acb10086d8c8
      Reviewed-on: https://go-review.googlesource.com/21533Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      eb876dd8
    • Brad Fitzpatrick's avatar
      doc: add httptest.ResponseRecorder note to go1.7.txt notes · b9531d31
      Brad Fitzpatrick authored
      Fixes #14928
      
      Change-Id: Id772eb623815cb2bb3e49de68a916762345a9dc1
      Reviewed-on: https://go-review.googlesource.com/21531Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      b9531d31
    • Dmitry Vyukov's avatar
      runtime: don't burn CPU unnecessarily · 475d113b
      Dmitry Vyukov authored
      Two GC-related functions, scang and casgstatus, wait in an active spin loop.
      Active spinning is never a good idea in user-space. Once we wait several
      times more than the expected wait time, something unexpected is happenning
      (e.g. the thread we are waiting for is descheduled or handling a page fault)
      and we need to yield to OS scheduler. Moreover, the expected wait time is
      very high for these functions: scang wait time can be tens of milliseconds,
      casgstatus can be hundreds of microseconds. It does not make sense to spin
      even for that time.
      
      go install -a std profile on a 4-core machine shows that 11% of time is spent
      in the active spin in scang:
      
        6.12%    compile  compile                [.] runtime.scang
        3.27%    compile  compile                [.] runtime.readgstatus
        1.72%    compile  compile                [.] runtime/internal/atomic.Load
      
      The active spin also increases tail latency in the case of the slightest
      oversubscription: GC goroutines spend whole quantum in the loop instead of
      executing user code.
      
      Here is scang wait time histogram during go install -a std:
      
      13707.0000 - 1815442.7667 [   118]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎...
      1815442.7667 - 3617178.5333 [     9]: ∎∎∎∎∎∎∎∎∎
      3617178.5333 - 5418914.3000 [    11]: ∎∎∎∎∎∎∎∎∎∎∎
      5418914.3000 - 7220650.0667 [     5]: ∎∎∎∎∎
      7220650.0667 - 9022385.8333 [    12]: ∎∎∎∎∎∎∎∎∎∎∎∎
      9022385.8333 - 10824121.6000 [    13]: ∎∎∎∎∎∎∎∎∎∎∎∎∎
      10824121.6000 - 12625857.3667 [    15]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      12625857.3667 - 14427593.1333 [    18]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      14427593.1333 - 16229328.9000 [    18]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      16229328.9000 - 18031064.6667 [    32]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      18031064.6667 - 19832800.4333 [    28]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      19832800.4333 - 21634536.2000 [     6]: ∎∎∎∎∎∎
      21634536.2000 - 23436271.9667 [    15]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      23436271.9667 - 25238007.7333 [    11]: ∎∎∎∎∎∎∎∎∎∎∎
      25238007.7333 - 27039743.5000 [    27]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      27039743.5000 - 28841479.2667 [    20]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      28841479.2667 - 30643215.0333 [    10]: ∎∎∎∎∎∎∎∎∎∎
      30643215.0333 - 32444950.8000 [     7]: ∎∎∎∎∎∎∎
      32444950.8000 - 34246686.5667 [     4]: ∎∎∎∎
      34246686.5667 - 36048422.3333 [     4]: ∎∎∎∎
      36048422.3333 - 37850158.1000 [     1]: ∎
      37850158.1000 - 39651893.8667 [     5]: ∎∎∎∎∎
      39651893.8667 - 41453629.6333 [     2]: ∎∎
      41453629.6333 - 43255365.4000 [     2]: ∎∎
      43255365.4000 - 45057101.1667 [     2]: ∎∎
      45057101.1667 - 46858836.9333 [     1]: ∎
      46858836.9333 - 48660572.7000 [     2]: ∎∎
      48660572.7000 - 50462308.4667 [     3]: ∎∎∎
      50462308.4667 - 52264044.2333 [     2]: ∎∎
      52264044.2333 - 54065780.0000 [     2]: ∎∎
      
      and the zoomed-in first part:
      
      13707.0000 - 19916.7667 [     2]: ∎∎
      19916.7667 - 26126.5333 [     2]: ∎∎
      26126.5333 - 32336.3000 [     9]: ∎∎∎∎∎∎∎∎∎
      32336.3000 - 38546.0667 [     8]: ∎∎∎∎∎∎∎∎
      38546.0667 - 44755.8333 [    12]: ∎∎∎∎∎∎∎∎∎∎∎∎
      44755.8333 - 50965.6000 [    10]: ∎∎∎∎∎∎∎∎∎∎
      50965.6000 - 57175.3667 [     5]: ∎∎∎∎∎
      57175.3667 - 63385.1333 [     6]: ∎∎∎∎∎∎
      63385.1333 - 69594.9000 [     5]: ∎∎∎∎∎
      69594.9000 - 75804.6667 [     6]: ∎∎∎∎∎∎
      75804.6667 - 82014.4333 [     6]: ∎∎∎∎∎∎
      82014.4333 - 88224.2000 [     4]: ∎∎∎∎
      88224.2000 - 94433.9667 [     1]: ∎
      94433.9667 - 100643.7333 [     1]: ∎
      100643.7333 - 106853.5000 [     2]: ∎∎
      106853.5000 - 113063.2667 [     0]:
      113063.2667 - 119273.0333 [     2]: ∎∎
      119273.0333 - 125482.8000 [     2]: ∎∎
      125482.8000 - 131692.5667 [     1]: ∎
      131692.5667 - 137902.3333 [     1]: ∎
      137902.3333 - 144112.1000 [     0]:
      144112.1000 - 150321.8667 [     2]: ∎∎
      150321.8667 - 156531.6333 [     1]: ∎
      156531.6333 - 162741.4000 [     1]: ∎
      162741.4000 - 168951.1667 [     0]:
      168951.1667 - 175160.9333 [     0]:
      175160.9333 - 181370.7000 [     1]: ∎
      181370.7000 - 187580.4667 [     1]: ∎
      187580.4667 - 193790.2333 [     2]: ∎∎
      193790.2333 - 200000.0000 [     0]:
      
      Here is casgstatus wait time histogram:
      
        631.0000 -  5276.6333 [     3]: ∎∎∎
       5276.6333 -  9922.2667 [     5]: ∎∎∎∎∎
       9922.2667 - 14567.9000 [     2]: ∎∎
      14567.9000 - 19213.5333 [     6]: ∎∎∎∎∎∎
      19213.5333 - 23859.1667 [     5]: ∎∎∎∎∎
      23859.1667 - 28504.8000 [     6]: ∎∎∎∎∎∎
      28504.8000 - 33150.4333 [     6]: ∎∎∎∎∎∎
      33150.4333 - 37796.0667 [     2]: ∎∎
      37796.0667 - 42441.7000 [     1]: ∎
      42441.7000 - 47087.3333 [     3]: ∎∎∎
      47087.3333 - 51732.9667 [     0]:
      51732.9667 - 56378.6000 [     1]: ∎
      56378.6000 - 61024.2333 [     0]:
      61024.2333 - 65669.8667 [     0]:
      65669.8667 - 70315.5000 [     0]:
      70315.5000 - 74961.1333 [     1]: ∎
      74961.1333 - 79606.7667 [     0]:
      79606.7667 - 84252.4000 [     0]:
      84252.4000 - 88898.0333 [     0]:
      88898.0333 - 93543.6667 [     0]:
      93543.6667 - 98189.3000 [     0]:
      98189.3000 - 102834.9333 [     0]:
      102834.9333 - 107480.5667 [     1]: ∎
      107480.5667 - 112126.2000 [     0]:
      112126.2000 - 116771.8333 [     0]:
      116771.8333 - 121417.4667 [     0]:
      121417.4667 - 126063.1000 [     0]:
      126063.1000 - 130708.7333 [     0]:
      130708.7333 - 135354.3667 [     0]:
      135354.3667 - 140000.0000 [     1]: ∎
      
      Ideally we eliminate the waiting by switching to async
      state machine for GC, but for now just yield to OS scheduler
      after a reasonable wait time.
      
      To choose yielding parameters I've measured
      golang.org/x/benchmarks/http tail latencies with different yield
      delays and oversubscription levels.
      
      With no oversubscription (to the degree possible):
      
      scang yield delay = 1, casgstatus yield delay = 1
      Latency-50   1.41ms ±15%  1.41ms ± 5%    ~     (p=0.611 n=13+12)
      Latency-95   5.21ms ± 2%  5.15ms ± 2%  -1.15%  (p=0.012 n=13+13)
      Latency-99   7.16ms ± 2%  7.05ms ± 2%  -1.54%  (p=0.002 n=13+13)
      Latency-999  10.7ms ± 9%  10.2ms ±10%  -5.46%  (p=0.004 n=12+13)
      
      scang yield delay = 5000, casgstatus yield delay = 3000
      Latency-50   1.41ms ±15%  1.41ms ± 8%    ~     (p=0.511 n=13+13)
      Latency-95   5.21ms ± 2%  5.14ms ± 2%  -1.23%  (p=0.006 n=13+13)
      Latency-99   7.16ms ± 2%  7.02ms ± 2%  -1.94%  (p=0.000 n=13+13)
      Latency-999  10.7ms ± 9%  10.1ms ± 8%  -6.14%  (p=0.000 n=12+13)
      
      scang yield delay = 10000, casgstatus yield delay = 5000
      Latency-50   1.41ms ±15%  1.45ms ± 6%    ~     (p=0.724 n=13+13)
      Latency-95   5.21ms ± 2%  5.18ms ± 1%    ~     (p=0.287 n=13+13)
      Latency-99   7.16ms ± 2%  7.05ms ± 2%  -1.64%  (p=0.002 n=13+13)
      Latency-999  10.7ms ± 9%  10.0ms ± 5%  -6.72%  (p=0.000 n=12+13)
      
      scang yield delay = 30000, casgstatus yield delay = 10000
      Latency-50   1.41ms ±15%  1.51ms ± 7%  +6.57%  (p=0.002 n=13+13)
      Latency-95   5.21ms ± 2%  5.21ms ± 2%    ~     (p=0.960 n=13+13)
      Latency-99   7.16ms ± 2%  7.06ms ± 2%  -1.50%  (p=0.012 n=13+13)
      Latency-999  10.7ms ± 9%  10.0ms ± 6%  -6.49%  (p=0.000 n=12+13)
      
      scang yield delay = 100000, casgstatus yield delay = 50000
      Latency-50   1.41ms ±15%  1.53ms ± 6%  +8.48%  (p=0.000 n=13+12)
      Latency-95   5.21ms ± 2%  5.23ms ± 2%    ~     (p=0.287 n=13+13)
      Latency-99   7.16ms ± 2%  7.08ms ± 2%  -1.21%  (p=0.004 n=13+13)
      Latency-999  10.7ms ± 9%   9.9ms ± 3%  -7.99%  (p=0.000 n=12+12)
      
      scang yield delay = 200000, casgstatus yield delay = 100000
      Latency-50   1.41ms ±15%  1.47ms ± 5%    ~     (p=0.072 n=13+13)
      Latency-95   5.21ms ± 2%  5.17ms ± 2%    ~     (p=0.091 n=13+13)
      Latency-99   7.16ms ± 2%  7.02ms ± 2%  -1.99%  (p=0.000 n=13+13)
      Latency-999  10.7ms ± 9%   9.9ms ± 5%  -7.86%  (p=0.000 n=12+13)
      
      With slight oversubscription (another instance of http benchmark
      was running in background with reduced GOMAXPROCS):
      
      scang yield delay = 1, casgstatus yield delay = 1
      Latency-50    840µs ± 3%   804µs ± 3%  -4.37%  (p=0.000 n=15+18)
      Latency-95   6.52ms ± 4%  6.03ms ± 4%  -7.51%  (p=0.000 n=18+18)
      Latency-99   10.8ms ± 7%  10.0ms ± 4%  -7.33%  (p=0.000 n=18+14)
      Latency-999  18.0ms ± 9%  16.8ms ± 7%  -6.84%  (p=0.000 n=18+18)
      
      scang yield delay = 5000, casgstatus yield delay = 3000
      Latency-50    840µs ± 3%   809µs ± 3%  -3.71%  (p=0.000 n=15+17)
      Latency-95   6.52ms ± 4%  6.11ms ± 4%  -6.29%  (p=0.000 n=18+18)
      Latency-99   10.8ms ± 7%   9.9ms ± 6%  -7.55%  (p=0.000 n=18+18)
      Latency-999  18.0ms ± 9%  16.5ms ±11%  -8.49%  (p=0.000 n=18+18)
      
      scang yield delay = 10000, casgstatus yield delay = 5000
      Latency-50    840µs ± 3%   823µs ± 5%  -2.06%  (p=0.002 n=15+18)
      Latency-95   6.52ms ± 4%  6.32ms ± 3%  -3.05%  (p=0.000 n=18+18)
      Latency-99   10.8ms ± 7%  10.2ms ± 4%  -5.22%  (p=0.000 n=18+18)
      Latency-999  18.0ms ± 9%  16.7ms ±10%  -7.09%  (p=0.000 n=18+18)
      
      scang yield delay = 30000, casgstatus yield delay = 10000
      Latency-50    840µs ± 3%   836µs ± 5%    ~     (p=0.442 n=15+18)
      Latency-95   6.52ms ± 4%  6.39ms ± 3%  -2.00%  (p=0.000 n=18+18)
      Latency-99   10.8ms ± 7%  10.2ms ± 6%  -5.15%  (p=0.000 n=18+17)
      Latency-999  18.0ms ± 9%  16.6ms ± 8%  -7.48%  (p=0.000 n=18+18)
      
      scang yield delay = 100000, casgstatus yield delay = 50000
      Latency-50    840µs ± 3%   836µs ± 6%    ~     (p=0.401 n=15+18)
      Latency-95   6.52ms ± 4%  6.40ms ± 4%  -1.79%  (p=0.010 n=18+18)
      Latency-99   10.8ms ± 7%  10.2ms ± 5%  -4.95%  (p=0.000 n=18+18)
      Latency-999  18.0ms ± 9%  16.5ms ±14%  -8.17%  (p=0.000 n=18+18)
      
      scang yield delay = 200000, casgstatus yield delay = 100000
      Latency-50    840µs ± 3%   828µs ± 2%  -1.49%  (p=0.001 n=15+17)
      Latency-95   6.52ms ± 4%  6.38ms ± 4%  -2.04%  (p=0.001 n=18+18)
      Latency-99   10.8ms ± 7%  10.2ms ± 4%  -4.77%  (p=0.000 n=18+18)
      Latency-999  18.0ms ± 9%  16.9ms ± 9%  -6.23%  (p=0.000 n=18+18)
      
      With significant oversubscription (background http benchmark
      was running with full GOMAXPROCS):
      
      scang yield delay = 1, casgstatus yield delay = 1
      Latency-50   1.32ms ±12%  1.30ms ±13%    ~     (p=0.454 n=14+14)
      Latency-95   16.3ms ±10%  15.3ms ± 7%  -6.29%  (p=0.001 n=14+14)
      Latency-99   29.4ms ±10%  27.9ms ± 5%  -5.04%  (p=0.001 n=14+12)
      Latency-999  49.9ms ±19%  45.9ms ± 5%  -8.00%  (p=0.008 n=14+13)
      
      scang yield delay = 5000, casgstatus yield delay = 3000
      Latency-50   1.32ms ±12%  1.29ms ± 9%    ~     (p=0.227 n=14+14)
      Latency-95   16.3ms ±10%  15.4ms ± 5%  -5.27%  (p=0.002 n=14+14)
      Latency-99   29.4ms ±10%  27.9ms ± 6%  -5.16%  (p=0.001 n=14+14)
      Latency-999  49.9ms ±19%  46.8ms ± 8%  -6.21%  (p=0.050 n=14+14)
      
      scang yield delay = 10000, casgstatus yield delay = 5000
      Latency-50   1.32ms ±12%  1.35ms ± 9%     ~     (p=0.401 n=14+14)
      Latency-95   16.3ms ±10%  15.0ms ± 4%   -7.67%  (p=0.000 n=14+14)
      Latency-99   29.4ms ±10%  27.4ms ± 5%   -6.98%  (p=0.000 n=14+14)
      Latency-999  49.9ms ±19%  44.7ms ± 5%  -10.56%  (p=0.000 n=14+11)
      
      scang yield delay = 30000, casgstatus yield delay = 10000
      Latency-50   1.32ms ±12%  1.36ms ±10%     ~     (p=0.246 n=14+14)
      Latency-95   16.3ms ±10%  14.9ms ± 5%   -8.31%  (p=0.000 n=14+14)
      Latency-99   29.4ms ±10%  27.4ms ± 7%   -6.70%  (p=0.000 n=14+14)
      Latency-999  49.9ms ±19%  44.9ms ±15%  -10.13%  (p=0.003 n=14+14)
      
      scang yield delay = 100000, casgstatus yield delay = 50000
      Latency-50   1.32ms ±12%  1.41ms ± 9%  +6.37%  (p=0.008 n=14+13)
      Latency-95   16.3ms ±10%  15.1ms ± 8%  -7.45%  (p=0.000 n=14+14)
      Latency-99   29.4ms ±10%  27.5ms ±12%  -6.67%  (p=0.002 n=14+14)
      Latency-999  49.9ms ±19%  45.9ms ±16%  -8.06%  (p=0.019 n=14+14)
      
      scang yield delay = 200000, casgstatus yield delay = 100000
      Latency-50   1.32ms ±12%  1.42ms ±10%   +7.21%  (p=0.003 n=14+14)
      Latency-95   16.3ms ±10%  15.0ms ± 7%   -7.59%  (p=0.000 n=14+14)
      Latency-99   29.4ms ±10%  27.3ms ± 8%   -7.20%  (p=0.000 n=14+14)
      Latency-999  49.9ms ±19%  44.8ms ± 8%  -10.21%  (p=0.001 n=14+13)
      
      All numbers are on 8 cores and with GOGC=10 (http benchmark has
      tiny heap, few goroutines and low allocation rate, so by default
      GC barely affects tail latency).
      
      10us/5us yield delays seem to provide a reasonable compromise
      and give 5-10% tail latency reduction. That's what used in this change.
      
      go install -a std results on 4 core machine:
      
      name      old time/op  new time/op  delta
      Time       8.39s ± 2%   7.94s ± 2%  -5.34%  (p=0.000 n=47+49)
      UserTime   24.6s ± 2%   22.9s ± 2%  -6.76%  (p=0.000 n=49+49)
      SysTime    1.77s ± 9%   1.89s ±11%  +7.00%  (p=0.000 n=49+49)
      CpuLoad    315ns ± 2%   313ns ± 1%  -0.59%  (p=0.000 n=49+48) # %CPU
      MaxRSS    97.1ms ± 4%  97.5ms ± 9%    ~     (p=0.838 n=46+49) # bytes
      
      Update #14396
      Update #14189
      
      Change-Id: I3f4109bf8f7fd79b39c466576690a778232055a2
      Reviewed-on: https://go-review.googlesource.com/21503
      Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRick Hudson <rlh@golang.org>
      Reviewed-by: default avatarAustin Clements <austin@google.com>
      475d113b
    • Dmitry Vyukov's avatar
      runtime: sleep less when we can do work · 3b246fa8
      Dmitry Vyukov authored
      Usleep(100) in runqgrab negatively affects latency and throughput
      of parallel application. We are sleeping instead of doing useful work.
      This is effect is particularly visible on windows where minimal
      sleep duration is 1-15ms.
      
      Reduce sleep from 100us to 3us and use osyield on windows.
      Sync chan send/recv takes ~50ns, so 3us gives us ~50x overshoot.
      
      benchmark                    old ns/op     new ns/op     delta
      BenchmarkChanSync-12         216           217           +0.46%
      BenchmarkChanSyncWork-12     27213         25816         -5.13%
      
      CPU consumption goes up from 106% to 108% in the first case,
      and from 107% to 125% in the second case.
      
      Test case from #14790 on windows:
      
      BenchmarkDefaultResolution-8  4583372   29720    -99.35%
      Benchmark1ms-8                992056    30701    -96.91%
      
      99-th latency percentile for HTTP request serving is improved by up to 15%
      (see http://golang.org/cl/20835 for details).
      
      The following benchmarks are from the change that originally added this sleep
      (see https://golang.org/s/go15gomaxprocs):
      
      name        old time/op  new time/op  delta
      Chain       22.6µs ± 2%  22.7µs ± 6%    ~      (p=0.905 n=9+10)
      ChainBuf    22.4µs ± 3%  22.5µs ± 4%    ~      (p=0.780 n=9+10)
      Chain-2     23.5µs ± 4%  24.9µs ± 1%  +5.66%   (p=0.000 n=10+9)
      ChainBuf-2  23.7µs ± 1%  24.4µs ± 1%  +3.31%   (p=0.000 n=9+10)
      Chain-4     24.2µs ± 2%  25.1µs ± 3%  +3.70%   (p=0.000 n=9+10)
      ChainBuf-4  24.4µs ± 5%  25.0µs ± 2%  +2.37%  (p=0.023 n=10+10)
      Powser       2.37s ± 1%   2.37s ± 1%    ~       (p=0.423 n=8+9)
      Powser-2     2.48s ± 2%   2.57s ± 2%  +3.74%   (p=0.000 n=10+9)
      Powser-4     2.66s ± 1%   2.75s ± 1%  +3.40%  (p=0.000 n=10+10)
      Sieve        13.3s ± 2%   13.3s ± 2%    ~      (p=1.000 n=10+9)
      Sieve-2      7.00s ± 2%   7.44s ±16%    ~      (p=0.408 n=8+10)
      Sieve-4      4.13s ±21%   3.85s ±22%    ~       (p=0.113 n=9+9)
      
      Fixes #14790
      
      Change-Id: Ie7c6a1c4f9c8eb2f5d65ab127a3845386d6f8b5d
      Reviewed-on: https://go-review.googlesource.com/20835Reviewed-by: default avatarAustin Clements <austin@google.com>
      3b246fa8
    • Ilya Tocar's avatar
      cmd/compile/internal/amd64: Use 32-bit operands for byte operations · 036d09d5
      Ilya Tocar authored
      We already generate ADDL for byte operations, reflect this in code.
      This also allows inc/dec for +-1 operation, which are 1-byte shorter,
      and enables lea for 3-operand addition/subtraction.
      
      Change-Id: Ibfdfee50667ca4cd3c28f72e3dece0c6d114d3ae
      Reviewed-on: https://go-review.googlesource.com/21251Reviewed-by: default avatarKeith Randall <khr@golang.org>
      Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      036d09d5
    • Augusto Roman's avatar
      encoding/json: allow non-string type keys for (un-)marshal · ffbd31e9
      Augusto Roman authored
      This CL allows JSON-encoding & -decoding maps whose keys are types that
      implement encoding.TextMarshaler / TextUnmarshaler.
      
      During encode, the map keys are marshaled upfront so that they can be
      sorted.
      
      Fixes #12146
      
      Change-Id: I43809750a7ad82a3603662f095c7baf75fd172da
      Reviewed-on: https://go-review.googlesource.com/20356
      Run-TryBot: Caleb Spare <cespare@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      ffbd31e9
    • Eric Lagergren's avatar
      io: define SeekStart, SeekCurrent, SeekEnd constants for use with Seeker · acefcb73
      Eric Lagergren authored
      Fixes #6885
      
      Change-Id: I6907958186f6a2427da1ad2f6c20bd5d7bf7a3f9
      Reviewed-on: https://go-review.googlesource.com/19862Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      acefcb73
    • Alexandru Moșoi's avatar
      cmd/compile: add a pass to print bound checks · 1747788c
      Alexandru Moșoi authored
      Since BCE happens over several passes (opt, loopbce, prove)
      it's easy to regress especially with rewriting.
      
      The pass is only activated with special debug flag.
      
      Change-Id: I46205982e7a2751156db8e875d69af6138068f59
      Reviewed-on: https://go-review.googlesource.com/21510
      Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarDavid Chase <drchase@google.com>
      1747788c
    • Brad Fitzpatrick's avatar
      net/http: zero pad Response status codes to three digits · 3bbede0c
      Brad Fitzpatrick authored
      Go 1.6's HTTP/1.x Transport started enforcing that responses have 3
      status digits, per the spec, but we could still write out invalid
      status codes ourselves if the called
      ResponseWriter.WriteHeader(0). That is bogus anyway, since the minimum
      status code is 1xx, but be a little bit less bogus (and consistent)
      and zero pad our responses.
      
      Change-Id: I6883901fd95073cb72f6b74035cabf1a79c35e1c
      Reviewed-on: https://go-review.googlesource.com/19130
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
      3bbede0c
    • Dave Cheney's avatar
      cmd/compile/internal/ssa: hide gen packge from ./make.bash · 7208a2cd
      Dave Cheney authored
      Fixes #15122
      
      Change-Id: Ie2c802d78aea731e25bf4b193b3c2e4c884e0573
      Reviewed-on: https://go-review.googlesource.com/21524
      Run-TryBot: Dave Cheney <dave@cheney.net>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      7208a2cd
    • David Symonds's avatar
      expvar: document that the Var interface's String method should return a valid JSON value. · e8f01e5c
      David Symonds authored
      Change-Id: If4e740f3dbef4053355542eebdd899b3099d872c
      Reviewed-on: https://go-review.googlesource.com/21525Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
      e8f01e5c
    • Paul Marks's avatar
      net: wait for cancelation goroutine before returning from connect. · 869e5765
      Paul Marks authored
      This fixes a race which made it possible to cancel a connection after
      returning from net.Dial.
      
      Fixes #15035
      Fixes #15078
      
      Change-Id: Iec6215009538362f7ad9f408a33549f3e94d1606
      Reviewed-on: https://go-review.googlesource.com/21497Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      869e5765
    • Alex Brainman's avatar
      cmd/go: leave directory before removing it in TestSharedLibName · bbbd572c
      Alex Brainman authored
      Fixes #15124
      
      Change-Id: I55fe4c2957370f3fb417c3df54f99fb085a5dada
      Reviewed-on: https://go-review.googlesource.com/21522Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      bbbd572c
    • Alex Brainman's avatar
      debug/gosym: do not forget to close test binay file handle in TestPCLine · 31f2bb4b
      Alex Brainman authored
      Fixes #15121
      
      Change-Id: I651521743c56244c55eda5762905889d7e06887a
      Reviewed-on: https://go-review.googlesource.com/21521Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      31f2bb4b
    • Alex Brainman's avatar
      runtime: leave directory before removing it in TestDLLPreloadMitigation · ffeae198
      Alex Brainman authored
      Fixes #15120
      
      Change-Id: I1d9a192ac163826bad8b46e8c0b0b9e218e69570
      Reviewed-on: https://go-review.googlesource.com/21520Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      ffeae198
    • Brad Fitzpatrick's avatar
      net/http: add Request.Context and Request.WithContext · c1c7547f
      Brad Fitzpatrick authored
      Currently only used by the client. The server is not yet wired up.  A
      TODO remains to document how it works server-side, once implemented.
      
      Updates #14660
      
      Change-Id: I27c2e74198872b2720995fa8271d91de200e23d5
      Reviewed-on: https://go-review.googlesource.com/21496Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
      c1c7547f
    • Alex Brainman's avatar
      runtime: remove race out of BenchmarkChanToSyscallPing1ms · fcac8809
      Alex Brainman authored
      Fixes #15119
      
      Change-Id: I31445bf282a5e2a160ff4e66c5a592b989a5798f
      Reviewed-on: https://go-review.googlesource.com/21448Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      fcac8809
    • Hiroshi Ioka's avatar
      path/filepath: normalize output of EvalSymlinks on windows · c4dda7e5
      Hiroshi Ioka authored
      Current implementation uses GetShortPathName and GetLongPathName
      to get a normalized path. That approach sometimes fails because
      user can disable short path name anytime. This CL provides
      an alternative approach suggested by MSDN.
      
      https://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx
      
      Fixes #13980
      
      Change-Id: Icf4afe4c9c4b507fc110c1483bf8db2c3f606b0a
      Reviewed-on: https://go-review.googlesource.com/20860Reviewed-by: default avatarAlex Brainman <alex.brainman@gmail.com>
      Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      c4dda7e5
    • Brad Fitzpatrick's avatar
      context: add the context package from golang.org/x/net/context · 9db7ef56
      Brad Fitzpatrick authored
      This copies the golang.org/x/net/context package to the standard library.
      
      It is imported from the x/net repo's git rev 1d9fd3b8333e (the most
      recent modified to x/net/context as of 2016-03-07).
      
      The corresponding change to x/net/context is in https://golang.org/cl/20347
      
      Updates #14660
      
      Change-Id: Ida14b1b7e115194d6218d9ac614548b9f41641cc
      Reviewed-on: https://go-review.googlesource.com/20346Reviewed-by: default avatarSameer Ajmani <sameer@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      9db7ef56
  2. 04 Apr, 2016 14 commits
    • Matthew Dempsky's avatar
      cmd/compile: minor cleanup to import loading · 0c71e293
      Matthew Dempsky authored
      Briefly document what the importfoo functions do.
      
      Get rid of importsym's unused result parameter.
      
      Get rid of the redundant calls to importsym(s, OTYPE)
      after we've already called pkgtype(s).
      
      Passes toolstash -cmp.
      
      Change-Id: I4c057358144044f5356e4dec68907ec85f1fe806
      Reviewed-on: https://go-review.googlesource.com/21498
      Run-TryBot: Matthew Dempsky <mdempsky@google.com>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      0c71e293
    • Mikio Hara's avatar
      net: factor out fdMutex-related methods on netFD · 86e7a5b9
      Mikio Hara authored
      Also updates documentation.
      
      Change-Id: Idb0fc0feed61407f7f07eab81ce82b55ffde5040
      Reviewed-on: https://go-review.googlesource.com/21446Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      86e7a5b9
    • Mikio Hara's avatar
      net: rename TestSelfConnect to TestTCPSelfConnect · 2ae749c1
      Mikio Hara authored
      Alos moves TestTCPSelfConnect into tcpsock_test.go
      
      Change-Id: I3e1cbd029594ecb36a67f42bc3ecdbc7176a95dc
      Reviewed-on: https://go-review.googlesource.com/21447
      Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      2ae749c1
    • Shahar Kohanim's avatar
      cmd/link: grow rdBuf lazily · bc942823
      Shahar Kohanim authored
      Counting the final buffer size usually doesn't result in the buffer growing,
      so assume that it doesn't need to grow and only grow if necessary.
      
      name       old secs    new secs    delta
      LinkCmdGo   0.49 ± 4%   0.48 ± 3%  -1.31%   (p=0.000 n=95+95)
      
      name       old MaxRSS  new MaxRSS  delta
      LinkCmdGo   122k ± 4%   121k ± 5%    ~     (p=0.065 n=96+100)
      
      Change-Id: I85e7f5688a61ef5ef2b1b7afe56507e71c5bd5b1
      Reviewed-on: https://go-review.googlesource.com/21509Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Shahar Kohanim <skohanim@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarDavid Crawshaw <crawshaw@golang.org>
      bc942823
    • Robert Griesemer's avatar
      cmd/compile: export inlined function bodies · a9ea36af
      Robert Griesemer authored
      Completed implementation for exporting inlined functions
      using the new binary export format. This change passes
      (export GO_GCFLAGS=-newexport; make all.bash) but for
      gc's builtin_test.go which we need to adjust before enabling
      this code by default.
      
      For a high-level description of the export format see the
      comment at the top of bexport.go.
      
      Major changes:
      
      1) The export format for the platform independent export data
         changed: When we export inlined function bodies, additional
         objects (other functions, types, etc.) that are referred to
         by the function bodies will need to be exported. While this
         doesn't affect the platform-independent portion directly, it
         adds more objects to the exportlist while we are exporting.
         Instead of trying to sort the objects into groups, just export
         objects as they appear in the export list. This is slightly
         less compact (one extra byte per object), but it is simpler
         and much more flexible.
      
      2) The export format contains now three sections: 1) The plat-
         form independent objects, 2) the objects pulled in for export
         via inlined function bodies, and 3) the inlined function bodies.
      
      3) Completed the exporting and importing code for inlined function
         bodies. The format is completely compiler-specific and easily
         changeable w/o affecting other tools. There is still quite a
         bit of room for denser encoding. This can happen at any time
         in the future.
      
      This change contains also the adjustments for go/internal/gcimporter,
      necessary because of the export format change 1) mentioned above.
      
      For #13241.
      
      Change-Id: I86bca0bd984b12ccf13d0d30892e6e25f6d04ed5
      Reviewed-on: https://go-review.googlesource.com/21172
      Run-TryBot: Robert Griesemer <gri@golang.org>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      a9ea36af
    • Matthew Dempsky's avatar
      cmd/compile: use *byte for pointer to string memory · 38e11d05
      Matthew Dempsky authored
      Change-Id: I14cff013ef4920d33b5ead0c75d51681bb4f635a
      Reviewed-on: https://go-review.googlesource.com/21337
      Run-TryBot: Matthew Dempsky <mdempsky@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      38e11d05
    • Marcel van Lohuizen's avatar
      testing: unflake TestBRun · 8bc9c57b
      Marcel van Lohuizen authored
      by only testing the lower bound of memalloc
      
      Fixes #15063
      
      Change-Id: Iab2fdd75e9ce98c641bfbce57f142fa47176772d
      Reviewed-on: https://go-review.googlesource.com/21507Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
      8bc9c57b
    • Alexandru Moșoi's avatar
      cmd/compile: constant fold modulo · 060501dc
      Alexandru Moșoi authored
      Fixes #15079
      
      Change-Id: Ib4dd9eab322da39234008e040100e75cb58761b3
      Reviewed-on: https://go-review.googlesource.com/21501Reviewed-by: default avatarDavid Chase <drchase@google.com>
      Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      060501dc
    • Alexandru Moșoi's avatar
      cmd/compile: fold IsInBounds of modulo. · 68325b56
      Alexandru Moșoi authored
      In b we only need the division by 0 check.
      
      func b(i uint, v []byte) byte {
          return v[i%uint(len(v))]
      }
      
      Updates #15079.
      
      Change-Id: Ic7491e677dd57cd6ba577efbce576dbb6e023cbd
      Reviewed-on: https://go-review.googlesource.com/21502
      Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
      Reviewed-by: default avatarDavid Chase <drchase@google.com>
      Reviewed-by: default avatarAhmed Waheed <oneofone@gmail.com>
      68325b56
    • Austin Clements's avatar
      runtime: fix pagesInUse accounting · 61f56e92
      Austin Clements authored
      When we grow the heap, we create a temporary "in use" span for the
      memory acquired from the OS and then free that span to link it into
      the heap. Hence, we (1) increase pagesInUse when we make the temporary
      span so that (2) freeing the span will correctly decrease it.
      
      However, currently step (1) increases pagesInUse by the number of
      pages requested from the heap, while step (2) decreases it by the
      number of pages requested from the OS (the size of the temporary
      span). These aren't necessarily the same, since we round up the number
      of pages we request from the OS, so steps 1 and 2 don't necessarily
      cancel out like they're supposed to. Over time, this can add up and
      cause pagesInUse to underflow and wrap around to 2^64. The garbage
      collector computes the sweep ratio from this, so if this happens, the
      sweep ratio becomes effectively infinite, causing the first allocation
      on each P in a sweep cycle to sweep the entire heap. This makes
      sweeping effectively STW.
      
      Fix this by increasing pagesInUse in step 1 by the number of pages
      requested from the OS, so that the two steps correctly cancel out. We
      add a test that checks that the running total matches the actual state
      of the heap.
      
      Fixes #15022. For 1.6.x.
      
      Change-Id: Iefd9d6abe37d0d447cbdbdf9941662e4f18eeffc
      Reviewed-on: https://go-review.googlesource.com/21280
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRuss Cox <rsc@golang.org>
      61f56e92
    • David Crawshaw's avatar
      cmd/link: keep types together when dynamic linking · 2d568895
      David Crawshaw authored
      To refer to types and names by offsets, we want to keep the symbols in
      the same sections. Do this by making all types .relro for now.
      
      Once name offsets are further along, name data can move out of relro.
      
      Change-Id: I1cbd2e914bd180cdf25c4aeb13d9c1c734febe69
      Reviewed-on: https://go-review.googlesource.com/21394Reviewed-by: default avatarMichael Hudson-Doyle <michael.hudson@canonical.com>
      Run-TryBot: David Crawshaw <crawshaw@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      2d568895
    • Caio Marcelo de Oliveira Filho's avatar
      go/types: better error when assigning to struct field in map · 74c0fea9
      Caio Marcelo de Oliveira Filho authored
      Identify this assignment case and instead of the more general error
      
          prog.go:6: cannot assign to students["sally"].age (value of type int)
      
      produce
      
          prog.go:6: cannot directly assign to struct field students["sally"].age in map
      
      that explains why the assignment is not possible. Used ExprString
      instead of String of operand since the type of the field is not relevant
      to the error.
      
      Updates #13779.
      
      Change-Id: I581251145ae6336ddd181b9ddd77f657c51b5aff
      Reviewed-on: https://go-review.googlesource.com/21463Reviewed-by: default avatarDavid Chase <drchase@google.com>
      Run-TryBot: David Chase <drchase@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      74c0fea9
    • Caio Marcelo de Oliveira Filho's avatar
      cmd/compile: better error when assigning to struct field in map · f229e467
      Caio Marcelo de Oliveira Filho authored
      Identify this assignment case and instead of the more general error
      
          prog.go:6: cannot assign to students["sally"].age
      
      produce
      
          prog.go:6: cannot directly assign to struct field students["sally"].age in map
      
      that explains why the assignment is not possible.
      
      Fixes #13779.
      
      Change-Id: I90c10b445f907834fc1735aa66e44a0f447aa74f
      Reviewed-on: https://go-review.googlesource.com/21462Reviewed-by: default avatarDavid Chase <drchase@google.com>
      f229e467
    • Alex Brainman's avatar
      runtime: change osyield to use Windows SwitchToThread · 1f5b1b2b
      Alex Brainman authored
      It appears that windows osyield is just 15ms sleep on my computer
      (see benchmarks below). Replace NtWaitForSingleObject in osyield
      with SwitchToThread (as suggested by Dmitry).
      
      Also add issue #14790 related benchmarks, so we can track perfomance
      changes in CL 20834 and CL 20835 and beyond.
      
      Update #14790
      
      benchmark                             old ns/op     new ns/op     delta
      BenchmarkChanToSyscallPing1ms         1953200       1953000       -0.01%
      BenchmarkChanToSyscallPing15ms        31562904      31248400      -1.00%
      BenchmarkSyscallToSyscallPing1ms      5247          4202          -19.92%
      BenchmarkSyscallToSyscallPing15ms     5260          4374          -16.84%
      BenchmarkChanToChanPing1ms            474           494           +4.22%
      BenchmarkChanToChanPing15ms           468           489           +4.49%
      BenchmarkOsYield1ms                   980018        75.5          -99.99%
      BenchmarkOsYield15ms                  15625200      75.8          -100.00%
      
      Change-Id: I1b4cc7caca784e2548ee3c846ca07ef152ebedce
      Reviewed-on: https://go-review.googlesource.com/21294
      Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      1f5b1b2b