1. 18 May, 2015 6 commits
    • Austin Clements's avatar
      runtime: use separate count and note for forEachP · f0dd0028
      Austin Clements authored
      Currently, forEachP reuses the stopwait and stopnote fields from
      stopTheWorld to track how many Ps have not responded to the safe-point
      request and to sleep until all Ps have responded.
      
      It was assumed this was safe because both stopTheWorld and forEachP
      must occur under the worlsema and hence stopwait and stopnote cannot
      be used for both purposes simultaneously and callers could always
      determine the appropriate use based on sched.gcwaiting (which is only
      set by stopTheWorld). However, this is not the case, since it's
      possible for there to be a window between when an M observes that
      gcwaiting is set and when it checks stopwait during which stopwait
      could have changed meanings. When this happens, the M decrements
      stopwait and may wakeup stopnote, but does not otherwise participate
      in the forEachP protocol. As a result, stopwait is decremented too
      many times, so it may reach zero before all Ps have run the safe-point
      function, causing forEachP to wake up early. It will then either
      observe that some P has not run the safe-point function and panic with
      "P did not run fn", or the remaining P (or Ps) will run the safe-point
      function before it wakes up and it will observe that stopwait is
      negative and panic with "not stopped".
      
      Fix this problem by giving forEachP its own safePointWait and
      safePointNote fields.
      
      One known sequence of events that can cause this race is as
      follows. It involves three actors:
      
      G1 is running on M1 on P1. P1 has an empty run queue.
      
      G2/M2 is in a blocked syscall and has lost its P. (The details of this
      don't matter, it just needs to be in a position where it needs to grab
      an idle P.)
      
      GC just started on G3/M3/P3. (These aren't very involved, they just
      have to be separate from the other G's, M's, and P's.)
      
      1. GC calls stopTheWorld(), which sets sched.gcwaiting to 1.
      
      Now G1/M1 begins to enter a syscall:
      
      2. G1/M1 invokes reentersyscall, which sets the P1's status to
         _Psyscall.
      
      3. G1/M1's reentersyscall observes gcwaiting != 0 and calls
         entersyscall_gcwait.
      
      4. G1/M1's entersyscall_gcwait blocks acquiring sched.lock.
      
      Back on GC:
      
      5. stopTheWorld cas's P1's status to _Pgcstop, does other stuff, and
         returns.
      
      6. GC does stuff and then calls startTheWorld().
      
      7. startTheWorld() calls procresize(), which sets P1's status to
         _Pidle and puts P1 on the idle list.
      
      Now G2/M2 returns from its syscall and takes over P1:
      
      8. G2/M2 returns from its blocked syscall and gets P1 from the idle
         list.
      
      9. G2/M2 acquires P1, which sets P1's status to _Prunning.
      
      10. G2/M2 starts a new syscall and invokes reentersyscall, which sets
          P1's status to _Psyscall.
      
      Back on G1/M1:
      
      11. G1/M1 finally acquires sched.lock in entersyscall_gcwait.
      
      At this point, G1/M1 still thinks it's running on P1. P1's status is
      _Psyscall, which is consistent with what G1/M1 is doing, but it's
      _Psyscall because *G2/M2* put it in to _Psyscall, not G1/M1. This is
      basically an ABA race on P1's status.
      
      Because forEachP currently shares stopwait with stopTheWorld. G1/M1's
      entersyscall_gcwait observes the non-zero stopwait set by forEachP,
      but mistakes it for a stopTheWorld. It cas's P1's status from
      _Psyscall (set by G2/M2) to _Pgcstop and proceeds to decrement
      stopwait one more time than forEachP was expecting.
      
      Fixes #10618. (See the issue for details on why the above race is safe
      when forEachP is not involved.)
      
      Prior to this commit, the command
        stress ./runtime.test -test.run TestFutexsleep\|TestGoroutineProfile
      would reliably fail after a few hundred runs. With this commit, it
      ran for over 2 million runs and never crashed.
      
      Change-Id: I9a91ea20035b34b6e5f07ef135b144115f281f30
      Reviewed-on: https://go-review.googlesource.com/10157Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      f0dd0028
    • Austin Clements's avatar
      runtime: hold worldsema while starting the world · 277acca2
      Austin Clements authored
      Currently, startTheWorld releases worldsema before starting the
      world. Since startTheWorld can change gomaxprocs after allowing Ps to
      run, this means that gomaxprocs can change while another P holds
      worldsema.
      
      Unfortunately, the garbage collector and forEachP assume that holding
      worldsema protects against changes in gomaxprocs (which it *almost*
      does). In particular, this is causing somewhat frequent "P did not run
      fn" crashes in forEachP in the runtime tests because gomaxprocs is
      changing between the several loops that forEachP does over all the Ps.
      
      Fix this by only releasing worldsema after the world is started.
      
      This relates to issue #10618. forEachP still fails under stress
      testing, but much less frequently.
      
      Change-Id: I085d627b70cca9ebe9af28fe73b9872f1bb224ff
      Reviewed-on: https://go-review.googlesource.com/10156Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      277acca2
    • Austin Clements's avatar
      runtime: disallow preemption during startTheWorld · 9c44a41d
      Austin Clements authored
      Currently, startTheWorld clears preemptoff for the current M before
      starting the world. A few callers increment m.locks around
      startTheWorld, presumably to prevent preemption any time during
      starting the world. This is almost certainly pointless (none of the
      other callers do this), but there's no harm in making startTheWorld
      keep preemption disabled until it's all done, which definitely lets us
      drop these m.locks manipulations.
      
      Change-Id: I8a93658abd0c72276c9bafa3d2c7848a65b4691a
      Reviewed-on: https://go-review.googlesource.com/10155Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      9c44a41d
    • Austin Clements's avatar
      runtime: factor stoptheworld/starttheworld pattern · a1da255a
      Austin Clements authored
      There are several steps to stopping and starting the world and
      currently they're open-coded in several places. The garbage collector
      is the only thing that needs to stop and start the world in a
      non-trivial pattern. Replace all other uses with calls to higher-level
      functions that implement the entire pattern necessary to stop and
      start the world.
      
      This is a pure refectoring and should not change any code semantics.
      In the following commits, we'll make changes that are easier to do
      with this abstraction in place.
      
      This commit renames the old starttheworld to startTheWorldWithSema.
      This is a slight misnomer right now because the callers release
      worldsema just before calling this. However, a later commit will swap
      these and I don't want to think of another name in the mean time.
      
      Change-Id: I5dc97f87b44fb98963c49c777d7053653974c911
      Reviewed-on: https://go-review.googlesource.com/10154Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      a1da255a
    • Austin Clements's avatar
      runtime: don't start GC if preemptoff is set · 5f7060af
      Austin Clements authored
      In order to avoid deadlocks, startGC avoids kicking off GC if locks
      are held by the calling M. However, it currently fails to check
      preemptoff, which is the other way to disable preemption.
      
      Fix this by adding a check for preemptoff.
      
      Change-Id: Ie1083166e5ba4af5c9d6c5a42efdfaaef41ca997
      Reviewed-on: https://go-review.googlesource.com/10153Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      5f7060af
    • Alex Brainman's avatar
      runtime: correct exception stack trace output · e544bee1
      Alex Brainman authored
      It is misleading when stack trace say:
      
      signal arrived during cgo execution
      
      but we are not in cgo call.
      
      Change-Id: I627e2f2bdc7755074677f77f21befc070a101914
      Reviewed-on: https://go-review.googlesource.com/9190Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      e544bee1
  2. 17 May, 2015 3 commits
  3. 16 May, 2015 4 commits
    • Russ Cox's avatar
      cmd/internal/gc: refine ginscmp comment · 6e8bcbbe
      Russ Cox authored
      Change-Id: I2ebb36c6c5de9d34e52ed523e9c888452591924a
      Reviewed-on: https://go-review.googlesource.com/10152Reviewed-by: 's avatarMinux Ma <minux@golang.org>
      6e8bcbbe
    • Russ Cox's avatar
      reflect: make PtrTo(FuncOf(...)) not crash · d36cc027
      Russ Cox authored
      Change-Id: Ie67e295bf327126dfdc75b73979fe33fbcb79ad9
      Reviewed-on: https://go-review.googlesource.com/10150Reviewed-by: 's avatarAustin Clements <austin@google.com>
      d36cc027
    • Russ Cox's avatar
      runtime: replace GC programs with simpler encoding, faster decoder · 512f75e8
      Russ Cox authored
      Small types record the location of pointers in their memory layout
      by using a simple bitmap. In Go 1.4 the bitmap held 4-bit entries,
      and in Go 1.5 the bitmap holds 1-bit entries, but in both cases using
      a bitmap for a large type containing arrays does not make sense:
      if someone refers to the type [1<<28]*byte in a program in such
      a way that the type information makes it into the binary, it would be
      a waste of space to write a 128 MB (for 4-bit entries) or even 32 MB
      (for 1-bit entries) bitmap full of 1s into the binary or even to keep
      one in memory during the execution of the program.
      
      For large types containing arrays, it is much more compact to describe
      the locations of pointers using a notation that can express repetition
      than to lay out a bitmap of pointers. Go 1.4 included such a notation,
      called ``GC programs'' but it was complex, required recursion during
      decoding, and was generally slow. Dmitriy measured the execution of
      these programs writing directly to the heap bitmap as being 7x slower
      than copying from a preunrolled 4-bit mask (and frankly that code was
      not terribly fast either). For some tests, unrollgcprog1 was seen costing
      as much as 3x more than the rest of malloc combined.
      
      This CL introduces a different form for the GC programs. They use a
      simple Lempel-Ziv-style encoding of the 1-bit pointer information,
      in which the only operations are (1) emit the following n bits
      and (2) repeat the last n bits c more times. This encoding can be
      generated directly from the Go type information (using repetition
      only for arrays or large runs of non-pointer data) and it can be decoded
      very efficiently. In particular the decoding requires little state and
      no recursion, so that the entire decoding can run without any memory
      accesses other than the reads of the encoding and the writes of the
      decoded form to the heap bitmap. For recursive types like arrays of
      arrays of arrays, the inner instructions are only executed once, not
      n times, so that large repetitions run at full speed. (In contrast, large
      repetitions in the old programs repeated the individual bit-level layout
      of the inner data over and over.) The result is as much as 25x faster
      decoding compared to the old form.
      
      Because the old decoder was so slow, Go 1.4 had three (or so) cases
      for how to set the heap bitmap bits for an allocation of a given type:
      
      (1) If the type had an even number of words up to 32 words, then
      the 4-bit pointer mask for the type fit in no more than 16 bytes;
      store the 4-bit pointer mask directly in the binary and copy from it.
      
      (1b) If the type had an odd number of words up to 15 words, then
      the 4-bit pointer mask for the type, doubled to end on a byte boundary,
      fit in no more than 16 bytes; store that doubled mask directly in the
      binary and copy from it.
      
      (2) If the type had an even number of words up to 128 words,
      or an odd number of words up to 63 words (again due to doubling),
      then the 4-bit pointer mask would fit in a 64-byte unrolled mask.
      Store a GC program in the binary, but leave space in the BSS for
      the unrolled mask. Execute the GC program to construct the mask the
      first time it is needed, and thereafter copy from the mask.
      
      (3) Otherwise, store a GC program and execute it to write directly to
      the heap bitmap each time an object of that type is allocated.
      (This is the case that was 7x slower than the other two.)
      
      Because the new pointer masks store 1-bit entries instead of 4-bit
      entries and because using the decoder no longer carries a significant
      overhead, after this CL (that is, for Go 1.5) there are only two cases:
      
      (1) If the type is 128 words or less (no condition about odd or even),
      store the 1-bit pointer mask directly in the binary and use it to
      initialize the heap bitmap during malloc. (Implemented in CL 9702.)
      
      (2) There is no case 2 anymore.
      
      (3) Otherwise, store a GC program and execute it to write directly to
      the heap bitmap each time an object of that type is allocated.
      
      Executing the GC program directly into the heap bitmap (case (3) above)
      was disabled for the Go 1.5 dev cycle, both to avoid needing to use
      GC programs for typedmemmove and to avoid updating that code as
      the heap bitmap format changed. Typedmemmove no longer uses this
      type information; as of CL 9886 it uses the heap bitmap directly.
      Now that the heap bitmap format is stable, we reintroduce GC programs
      and their space savings.
      
      Benchmarks for heapBitsSetType, before this CL vs this CL:
      
      name                    old mean               new mean              delta
      SetTypePtr              7.59ns × (0.99,1.02)   5.16ns × (1.00,1.00)  -32.05% (p=0.000)
      SetTypePtr8             21.0ns × (0.98,1.05)   21.4ns × (1.00,1.00)     ~    (p=0.179)
      SetTypePtr16            24.1ns × (0.99,1.01)   24.6ns × (1.00,1.00)   +2.41% (p=0.001)
      SetTypePtr32            31.2ns × (0.99,1.01)   32.4ns × (0.99,1.02)   +3.72% (p=0.001)
      SetTypePtr64            45.2ns × (1.00,1.00)   47.2ns × (1.00,1.00)   +4.42% (p=0.000)
      SetTypePtr126           75.8ns × (0.99,1.01)   79.1ns × (1.00,1.00)   +4.25% (p=0.000)
      SetTypePtr128           74.3ns × (0.99,1.01)   77.6ns × (1.00,1.01)   +4.55% (p=0.000)
      SetTypePtrSlice          726ns × (1.00,1.01)    712ns × (1.00,1.00)   -1.95% (p=0.001)
      SetTypeNode1            20.0ns × (0.99,1.01)   20.7ns × (1.00,1.00)   +3.71% (p=0.000)
      SetTypeNode1Slice        112ns × (1.00,1.00)    113ns × (0.99,1.00)     ~    (p=0.070)
      SetTypeNode8            23.9ns × (1.00,1.00)   24.7ns × (1.00,1.01)   +3.18% (p=0.000)
      SetTypeNode8Slice        294ns × (0.99,1.02)    287ns × (0.99,1.01)   -2.38% (p=0.015)
      SetTypeNode64           52.8ns × (0.99,1.03)   51.8ns × (0.99,1.01)     ~    (p=0.069)
      SetTypeNode64Slice      1.13µs × (0.99,1.05)   1.14µs × (0.99,1.00)     ~    (p=0.767)
      SetTypeNode64Dead       36.0ns × (1.00,1.01)   32.5ns × (0.99,1.00)   -9.67% (p=0.000)
      SetTypeNode64DeadSlice  1.43µs × (0.99,1.01)   1.40µs × (1.00,1.00)   -2.39% (p=0.001)
      SetTypeNode124          75.7ns × (1.00,1.01)   79.0ns × (1.00,1.00)   +4.44% (p=0.000)
      SetTypeNode124Slice     1.94µs × (1.00,1.01)   2.04µs × (0.99,1.01)   +4.98% (p=0.000)
      SetTypeNode126          75.4ns × (1.00,1.01)   77.7ns × (0.99,1.01)   +3.11% (p=0.000)
      SetTypeNode126Slice     1.95µs × (0.99,1.01)   2.03µs × (1.00,1.00)   +3.74% (p=0.000)
      SetTypeNode128          85.4ns × (0.99,1.01)  122.0ns × (1.00,1.00)  +42.89% (p=0.000)
      SetTypeNode128Slice     2.20µs × (1.00,1.01)   2.36µs × (0.98,1.02)   +7.48% (p=0.001)
      SetTypeNode130          83.3ns × (1.00,1.00)  123.0ns × (1.00,1.00)  +47.61% (p=0.000)
      SetTypeNode130Slice     2.30µs × (0.99,1.01)   2.40µs × (0.98,1.01)   +4.37% (p=0.000)
      SetTypeNode1024          498ns × (1.00,1.00)    537ns × (1.00,1.00)   +7.96% (p=0.000)
      SetTypeNode1024Slice    15.5µs × (0.99,1.01)   17.8µs × (1.00,1.00)  +15.27% (p=0.000)
      
      The above compares always using a cached pointer mask (and the
      corresponding waste of memory) against using the programs directly.
      Some slowdown is expected, in exchange for having a better general algorithm.
      The GC programs kick in for SetTypeNode128, SetTypeNode130, SetTypeNode1024,
      along with the slice variants of those.
      It is possible that the cutoff of 128 words (bits) should be raised
      in a followup CL, but even with this low cutoff the GC programs are
      faster than Go 1.4's "fast path" non-GC program case.
      
      Benchmarks for heapBitsSetType, Go 1.4 vs this CL:
      
      name                    old mean              new mean              delta
      SetTypePtr              6.89ns × (1.00,1.00)  5.17ns × (1.00,1.00)  -25.02% (p=0.000)
      SetTypePtr8             25.8ns × (0.97,1.05)  21.5ns × (1.00,1.00)  -16.70% (p=0.000)
      SetTypePtr16            39.8ns × (0.97,1.02)  24.7ns × (0.99,1.01)  -37.81% (p=0.000)
      SetTypePtr32            68.8ns × (0.98,1.01)  32.2ns × (1.00,1.01)  -53.18% (p=0.000)
      SetTypePtr64             130ns × (1.00,1.00)    47ns × (1.00,1.00)  -63.67% (p=0.000)
      SetTypePtr126            241ns × (0.99,1.01)    79ns × (1.00,1.01)  -67.25% (p=0.000)
      SetTypePtr128           2.07µs × (1.00,1.00)  0.08µs × (1.00,1.00)  -96.27% (p=0.000)
      SetTypePtrSlice         1.05µs × (0.99,1.01)  0.72µs × (0.99,1.02)  -31.70% (p=0.000)
      SetTypeNode1            16.0ns × (0.99,1.01)  20.8ns × (0.99,1.03)  +29.91% (p=0.000)
      SetTypeNode1Slice        184ns × (0.99,1.01)   112ns × (0.99,1.01)  -39.26% (p=0.000)
      SetTypeNode8            29.5ns × (0.97,1.02)  24.6ns × (1.00,1.00)  -16.50% (p=0.000)
      SetTypeNode8Slice        624ns × (0.98,1.02)   285ns × (1.00,1.00)  -54.31% (p=0.000)
      SetTypeNode64            135ns × (0.96,1.08)    52ns × (0.99,1.02)  -61.32% (p=0.000)
      SetTypeNode64Slice      3.83µs × (1.00,1.00)  1.14µs × (0.99,1.01)  -70.16% (p=0.000)
      SetTypeNode64Dead        134ns × (0.99,1.01)    32ns × (1.00,1.01)  -75.74% (p=0.000)
      SetTypeNode64DeadSlice  3.83µs × (0.99,1.00)  1.40µs × (1.00,1.01)  -63.42% (p=0.000)
      SetTypeNode124           240ns × (0.99,1.01)    79ns × (1.00,1.01)  -67.05% (p=0.000)
      SetTypeNode124Slice     7.27µs × (1.00,1.00)  2.04µs × (1.00,1.00)  -71.95% (p=0.000)
      SetTypeNode126          2.06µs × (0.99,1.01)  0.08µs × (0.99,1.01)  -96.23% (p=0.000)
      SetTypeNode126Slice     64.4µs × (1.00,1.00)   2.0µs × (1.00,1.00)  -96.85% (p=0.000)
      SetTypeNode128          2.09µs × (1.00,1.01)  0.12µs × (1.00,1.00)  -94.15% (p=0.000)
      SetTypeNode128Slice     65.4µs × (1.00,1.00)   2.4µs × (0.99,1.03)  -96.39% (p=0.000)
      SetTypeNode130          2.11µs × (1.00,1.00)  0.12µs × (1.00,1.00)  -94.18% (p=0.000)
      SetTypeNode130Slice     66.3µs × (1.00,1.00)   2.4µs × (0.97,1.08)  -96.34% (p=0.000)
      SetTypeNode1024         16.0µs × (1.00,1.01)   0.5µs × (1.00,1.00)  -96.65% (p=0.000)
      SetTypeNode1024Slice     512µs × (1.00,1.00)    18µs × (0.98,1.04)  -96.45% (p=0.000)
      
      SetTypeNode124 uses a 124 data + 2 ptr = 126-word allocation.
      Both Go 1.4 and this CL are using pointer bitmaps for this case,
      so that's an overall 3x speedup for using pointer bitmaps.
      
      SetTypeNode128 uses a 128 data + 2 ptr = 130-word allocation.
      Both Go 1.4 and this CL are running the GC program for this case,
      so that's an overall 17x speedup when using GC programs (and
      I've seen >20x on other systems).
      
      Comparing Go 1.4's SetTypeNode124 (pointer bitmap) against
      this CL's SetTypeNode128 (GC program), the slow path in the
      code in this CL is 2x faster than the fast path in Go 1.4.
      
      The Go 1 benchmarks are basically unaffected compared to just before this CL.
      
      Go 1 benchmarks, before this CL vs this CL:
      
      name                   old mean              new mean              delta
      BinaryTree17            5.87s × (0.97,1.04)   5.91s × (0.96,1.04)    ~    (p=0.306)
      Fannkuch11              4.38s × (1.00,1.00)   4.37s × (1.00,1.01)  -0.22% (p=0.006)
      FmtFprintfEmpty        90.7ns × (0.97,1.10)  89.3ns × (0.96,1.09)    ~    (p=0.280)
      FmtFprintfString        282ns × (0.98,1.04)   287ns × (0.98,1.07)  +1.72% (p=0.039)
      FmtFprintfInt           269ns × (0.99,1.03)   282ns × (0.97,1.04)  +4.87% (p=0.000)
      FmtFprintfIntInt        478ns × (0.99,1.02)   481ns × (0.99,1.02)  +0.61% (p=0.048)
      FmtFprintfPrefixedInt   399ns × (0.98,1.03)   400ns × (0.98,1.05)    ~    (p=0.533)
      FmtFprintfFloat         563ns × (0.99,1.01)   570ns × (1.00,1.01)  +1.37% (p=0.000)
      FmtManyArgs            1.89µs × (0.99,1.01)  1.92µs × (0.99,1.02)  +1.88% (p=0.000)
      GobDecode              15.2ms × (0.99,1.01)  15.2ms × (0.98,1.05)    ~    (p=0.609)
      GobEncode              11.6ms × (0.98,1.03)  11.9ms × (0.98,1.04)  +2.17% (p=0.000)
      Gzip                    648ms × (0.99,1.01)   648ms × (1.00,1.01)    ~    (p=0.835)
      Gunzip                  142ms × (1.00,1.00)   143ms × (1.00,1.01)    ~    (p=0.169)
      HTTPClientServer       90.5µs × (0.98,1.03)  91.5µs × (0.98,1.04)  +1.04% (p=0.045)
      JSONEncode             31.5ms × (0.98,1.03)  31.4ms × (0.98,1.03)    ~    (p=0.549)
      JSONDecode              111ms × (0.99,1.01)   107ms × (0.99,1.01)  -3.21% (p=0.000)
      Mandelbrot200          6.01ms × (1.00,1.00)  6.01ms × (1.00,1.00)    ~    (p=0.878)
      GoParse                6.54ms × (0.99,1.02)  6.61ms × (0.99,1.03)  +1.08% (p=0.004)
      RegexpMatchEasy0_32     160ns × (1.00,1.01)   161ns × (1.00,1.00)  +0.40% (p=0.000)
      RegexpMatchEasy0_1K     560ns × (0.99,1.01)   559ns × (0.99,1.01)    ~    (p=0.088)
      RegexpMatchEasy1_32     138ns × (0.99,1.01)   138ns × (1.00,1.00)    ~    (p=0.380)
      RegexpMatchEasy1_1K     877ns × (1.00,1.00)   878ns × (1.00,1.00)    ~    (p=0.157)
      RegexpMatchMedium_32    251ns × (0.99,1.00)   251ns × (1.00,1.01)  +0.28% (p=0.021)
      RegexpMatchMedium_1K   72.6µs × (1.00,1.00)  72.6µs × (1.00,1.00)    ~    (p=0.539)
      RegexpMatchHard_32     3.84µs × (1.00,1.00)  3.84µs × (1.00,1.00)    ~    (p=0.378)
      RegexpMatchHard_1K      117µs × (1.00,1.00)   117µs × (1.00,1.00)    ~    (p=0.067)
      Revcomp                 904ms × (0.99,1.02)   904ms × (0.99,1.01)    ~    (p=0.943)
      Template                125ms × (0.99,1.02)   127ms × (0.99,1.01)  +1.79% (p=0.000)
      TimeParse               627ns × (0.99,1.01)   622ns × (0.99,1.01)  -0.88% (p=0.000)
      TimeFormat              655ns × (0.99,1.02)   655ns × (0.99,1.02)    ~    (p=0.976)
      
      For the record, Go 1 benchmarks, Go 1.4 vs this CL:
      
      name                   old mean              new mean              delta
      BinaryTree17            4.61s × (0.97,1.05)   5.91s × (0.98,1.03)  +28.35% (p=0.000)
      Fannkuch11              4.40s × (0.99,1.03)   4.41s × (0.99,1.01)     ~    (p=0.212)
      FmtFprintfEmpty         102ns × (0.99,1.01)    84ns × (0.99,1.02)  -18.38% (p=0.000)
      FmtFprintfString        302ns × (0.98,1.01)   303ns × (0.99,1.02)     ~    (p=0.203)
      FmtFprintfInt           313ns × (0.97,1.05)   270ns × (0.99,1.01)  -13.69% (p=0.000)
      FmtFprintfIntInt        524ns × (0.98,1.02)   477ns × (0.99,1.00)   -8.87% (p=0.000)
      FmtFprintfPrefixedInt   424ns × (0.98,1.02)   386ns × (0.99,1.01)   -8.96% (p=0.000)
      FmtFprintfFloat         652ns × (0.98,1.02)   594ns × (0.97,1.05)   -8.97% (p=0.000)
      FmtManyArgs            2.13µs × (0.99,1.02)  1.94µs × (0.99,1.01)   -8.92% (p=0.000)
      GobDecode              17.1ms × (0.99,1.02)  14.9ms × (0.98,1.03)  -13.07% (p=0.000)
      GobEncode              13.5ms × (0.98,1.03)  11.5ms × (0.98,1.03)  -15.25% (p=0.000)
      Gzip                    656ms × (0.99,1.02)   647ms × (0.99,1.01)   -1.29% (p=0.000)
      Gunzip                  143ms × (0.99,1.02)   144ms × (0.99,1.01)     ~    (p=0.204)
      HTTPClientServer       88.2µs × (0.98,1.02)  90.8µs × (0.98,1.01)   +2.93% (p=0.000)
      JSONEncode             32.2ms × (0.98,1.02)  30.9ms × (0.97,1.04)   -4.06% (p=0.001)
      JSONDecode              121ms × (0.98,1.02)   110ms × (0.98,1.05)   -8.95% (p=0.000)
      Mandelbrot200          6.06ms × (0.99,1.01)  6.11ms × (0.98,1.04)     ~    (p=0.184)
      GoParse                6.76ms × (0.97,1.04)  6.58ms × (0.98,1.05)   -2.63% (p=0.003)
      RegexpMatchEasy0_32     195ns × (1.00,1.01)   155ns × (0.99,1.01)  -20.43% (p=0.000)
      RegexpMatchEasy0_1K     479ns × (0.98,1.03)   535ns × (0.99,1.02)  +11.59% (p=0.000)
      RegexpMatchEasy1_32     169ns × (0.99,1.02)   131ns × (0.99,1.03)  -22.44% (p=0.000)
      RegexpMatchEasy1_1K    1.53µs × (0.99,1.01)  0.87µs × (0.99,1.02)  -43.07% (p=0.000)
      RegexpMatchMedium_32    334ns × (0.99,1.01)   242ns × (0.99,1.01)  -27.53% (p=0.000)
      RegexpMatchMedium_1K    125µs × (1.00,1.01)    72µs × (0.99,1.03)  -42.53% (p=0.000)
      RegexpMatchHard_32     6.03µs × (0.99,1.01)  3.79µs × (0.99,1.01)  -37.12% (p=0.000)
      RegexpMatchHard_1K      189µs × (0.99,1.02)   115µs × (0.99,1.01)  -39.20% (p=0.000)
      Revcomp                 935ms × (0.96,1.03)   926ms × (0.98,1.02)     ~    (p=0.083)
      Template                146ms × (0.97,1.05)   119ms × (0.99,1.01)  -18.37% (p=0.000)
      TimeParse               660ns × (0.99,1.01)   624ns × (0.99,1.02)   -5.43% (p=0.000)
      TimeFormat              670ns × (0.98,1.02)   710ns × (1.00,1.01)   +5.97% (p=0.000)
      
      This CL is a bit larger than I would like, but the compiler, linker, runtime,
      and package reflect all need to be in sync about the format of these programs,
      so there is no easy way to split this into independent changes (at least
      while keeping the build working at each change).
      
      Fixes #9625.
      Fixes #10524.
      
      Change-Id: I9e3e20d6097099d0f8532d1cb5b1af528804989a
      Reviewed-on: https://go-review.googlesource.com/9888Reviewed-by: 's avatarAustin Clements <austin@google.com>
      Run-TryBot: Russ Cox <rsc@golang.org>
      512f75e8
    • Didier Spezia's avatar
      text/template: fix race condition on function maps · ebe733cb
      Didier Spezia authored
      The Template objects are supposed to be goroutine-safe once they
      have been parsed. This includes the text and html ones.
      
      For html/template, the escape mechanism is triggered at execution
      time. It may alter the internal structures of the template, so
      a mutex protects them against concurrent accesses.
      
      The text/template package is free of any synchronization primitive.
      
      A race condition may occur when nested templates are escaped:
      the escape algorithm alters the function maps of the associated
      text templates, while a concurrent template execution may access
      the function maps in read mode.
      
      The less invasive fix I have found is to introduce a RWMutex in
      text/template to protect the function maps. This is unfortunate
      but it should be effective.
      
      Fixes #9945
      
      Change-Id: I1edb73c0ed0f1fcddd2f1516230b548b92ab1269
      Reviewed-on: https://go-review.googlesource.com/10101Reviewed-by: 's avatarRob Pike <r@golang.org>
      ebe733cb
  4. 15 May, 2015 27 commits
    • Russ Cox's avatar
      runtime: make mapzero not crash on arm · d820d5f3
      Russ Cox authored
      Change-Id: I40e8a4a2e62253233b66f6a2e61e222437292c31
      Reviewed-on: https://go-review.googlesource.com/10151Reviewed-by: 's avatarMinux Ma <minux@golang.org>
      d820d5f3
    • Michael Hudson-Doyle's avatar
      cmd/internal/ld: prevent creation of .dynamic and .dynsym symbols when externally linking · ddc4c146
      Michael Hudson-Doyle authored
      This allows the removal of a fudge in data.go.
      
      We have to defer the calls to adddynlib on non-Darwin until after we have
      decided whether we are externally or internally linking.  The Macho/ELF
      separation could do with some cleaning up, but: code freeze.
      
      Fixing this once rather than per-arch is what inspired the previous CLs.
      
      Change-Id: I0166f7078a045dc09827745479211247466c0c54
      Reviewed-on: https://go-review.googlesource.com/10002
      Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      ddc4c146
    • Michael Hudson-Doyle's avatar
      cmd/5l, etc, cmd/internal/ld: consolidate implementations of adddynsym · 4cfff271
      Michael Hudson-Doyle authored
      The only essential difference is elf32 vs elf64, I assume the other differences
      are bugs in one version or another...
      
      Change-Id: Ie6ff33d5574a6592b543df9983eff8fdf88c97a1
      Reviewed-on: https://go-review.googlesource.com/10001
      Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
      Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      4cfff271
    • Michael Hudson-Doyle's avatar
      cmd/5l, etc, cmd/internal/ld: consolidate implementations of adddynlib · 00470609
      Michael Hudson-Doyle authored
      They were all essentially the same.
      
      Change-Id: I6e0b548cda6e4bbe2ec3b3025b746d1f6d332d48
      Reviewed-on: https://go-review.googlesource.com/10000
      Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      00470609
    • Russ Cox's avatar
      runtime: test and fix heap bitmap for 1-pointer allocation on 32-bit system · c3c047a6
      Russ Cox authored
      Change-Id: Ic064fe7c6bd3304dcc8c3f7b3b5393870b5387c2
      Reviewed-on: https://go-review.googlesource.com/10119
      Run-TryBot: Austin Clements <austin@google.com>
      Reviewed-by: 's avatarAustin Clements <austin@google.com>
      c3c047a6
    • Josh Bleecher Snyder's avatar
      cmd/internal/gc: unembed Name field · 8fa14ea8
      Josh Bleecher Snyder authored
      This is an automated follow-up to CL 10120.
      It was generated with a combination of eg and gofmt -r.
      
      No functional changes. Passes toolstash -cmp.
      
      Change-Id: I0dc6d146372012b4cce9cc4064066daa6694eee6
      Reviewed-on: https://go-review.googlesource.com/10144Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      8fa14ea8
    • Alex A Skinner's avatar
      net: redo resolv.conf recheck implementation · ef7e1085
      Alex A Skinner authored
      The previous implementation spawned an extra goroutine to handle
      rechecking resolv.conf for changes.
      
      This change eliminates the extra goroutine, and has rechecking
      done as part of a lookup.  A side effect of this change is that the
      first lookup after a resolv.conf change will now succeed, whereas
      previously it would have failed.  It also fixes rechecking logic to
      ignore resolv.conf parsing errors as it should.
      
      Fixes #8652
      Fixes #10576
      Fixes #10649
      Fixes #10650
      Fixes #10845
      
      Change-Id: I502b587c445fa8eca5207ca4f2c8ec8c339fec7f
      Reviewed-on: https://go-review.googlesource.com/9991
      Run-TryBot: Matthew Dempsky <mdempsky@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: 's avatarJosh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: 's avatarMikio Hara <mikioh.mikioh@gmail.com>
      Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      ef7e1085
    • Robert Griesemer's avatar
      go/parser: better error message for missing ',' in lists · 40fad6c2
      Robert Griesemer authored
      Fixes #8940.
      
      Change-Id: Ie9e5149983518ba8d56ddd82ac8f4cde6b644167
      Reviewed-on: https://go-review.googlesource.com/10089Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
      40fad6c2
    • Matthew Dempsky's avatar
      cmd/internal/obj: update callers to Linkline{fmt,hist} and remove · 1467776b
      Matthew Dempsky authored
      Does the TODOs added by https://golang.org/cl/7623.
      
      Passes rsc.io/toolstash/buildall.
      
      Change-Id: I23913a8f03834640e9795d48318febb3f88c10f9
      Reviewed-on: https://go-review.googlesource.com/9160Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      1467776b
    • Matthew Dempsky's avatar
      cmd/internal/gc, cmd/yacc: merge yaccerrors.go into cmd/yacc · 82e1651a
      Matthew Dempsky authored
      This extends cmd/yacc with support for
      
      	%error { tokens } : message
      
      syntax to specify custom error messages to use instead of the default
      generic ones.  This allows merging go.errors into go.y and removing
      the yaccerrors.go tool.
      
      Updates #9968.
      
      Change-Id: I781219c568b86472755f877f48401eaeab00ead5
      Reviewed-on: https://go-review.googlesource.com/8563Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      82e1651a
    • Brad Fitzpatrick's avatar
      syscall: don't run fcntl child process test on iOS · d4ed3061
      Brad Fitzpatrick authored
      Fixes darwin-arm{,64} builds.
      Child processes aren't allowed on iOS.
      
      Change-Id: I9258ed4df757ec394ef6327dbda96f5b9705bcdd
      Reviewed-on: https://go-review.googlesource.com/10142Reviewed-by: 's avatarHyang-Ah Hana Kim <hyangah@gmail.com>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      d4ed3061
    • Brad Fitzpatrick's avatar
      Revert "cmd/internal/gc: ignore declarations of types for goto validation" · 97494a45
      Brad Fitzpatrick authored
      This reverts commit 5726af54.
      
      It broke all the builds.
      
      Change-Id: I4b1dde86f9433717d303c1dabd6aa1a2bf97fab2
      Reviewed-on: https://go-review.googlesource.com/10143Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      97494a45
    • Håvard Haugen's avatar
      encoding/json: fix decoding of types with '[]byte' as underlying type · 4302fd04
      Håvard Haugen authored
      All slice types which have elements of kind reflect.Uint8 are marshalled
      into base64 for compactness. When decoding such data into a custom type
      based on []byte the decoder checked the slice kind instead of the slice
      element kind, so no appropriate decoder was found.
      
      Fixed by letting the decoder check slice element kind like the encoder.
      This guarantees that already encoded data can still be successfully
      decoded.
      
      Fixes #8962.
      
      Change-Id: Ia320d4dc2c6e9e5fe6d8dc15788c81da23d20c4f
      Reviewed-on: https://go-review.googlesource.com/9371Reviewed-by: 's avatarPeter Waldschmidt <peter@waldschmidt.com>
      Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      4302fd04
    • Daniel Morsing's avatar
      cmd/internal/gc: ignore declarations of types for goto validation · 5726af54
      Daniel Morsing authored
      Fixes #8042.
      
      Change-Id: I75080f24104256065fd73b07a13c5b8e7d6da94c
      Reviewed-on: https://go-review.googlesource.com/9442Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      5726af54
    • Josh Bleecher Snyder's avatar
      cmd/internal/gc: separate Name-only Node fields · 76ec0ee5
      Josh Bleecher Snyder authored
      Name will be converted from an anonymous to a
      named field in a subsequent, automated CL.
      
      No functional changes. Passes toolstash -cmp.
      
      This reduces the size of gc.Node from 424 to 400 bytes.
      This in turn reduces the permanent (pprof -inuse_space)
      memory usage while compiling the test/rotate?.go tests:
      
      test	old(MB)	new(MB)	change
      rotate0	379.49	367.30	-3.21%
      rotate1	373.42	361.59	-3.16%
      rotate2	381.17	368.77	-3.25%
      rotate3	374.30	362.48	-3.15%
      
      Updates #9933.
      
      Change-Id: I21479527c136add4f1efb9342774e3be3e276e83
      Reviewed-on: https://go-review.googlesource.com/10120Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      76ec0ee5
    • Josh Bleecher Snyder's avatar
      cmd/internal/gc: convert Val.U to interface{} · 13485be9
      Josh Bleecher Snyder authored
      This CL was generated by updating Val in go.go
      and then running:
      
      sed -i "" 's/\.U\.[SBXFC]val = /.U = /' *.go
      sed -i "" 's/\.U\.Sval/.U.\(string\)/g' *.go *.y
      sed -i "" 's/\.U\.Bval/.U.\(bool\)/g' *.go *.y
      sed -i "" 's/\.U\.Xval/.U.\(\*Mpint\)/g' *.go *.y
      sed -i "" 's/\.U\.Fval/.U.\(\*Mpflt\)/g' *.go *.y
      sed -i "" 's/\.U\.Cval/.U.\(\*Mpcplx\)/g' *.go *.y
      
      No functional changes. Passes toolstash -cmp.
      
      This reduces the size of gc.Node from 424 to 392 bytes.
      This in turn reduces the permanent (pprof -inuse_space)
      memory usage while compiling the test/rotate?.go tests:
      
      test	old(MB)	new(MB)	change
      rotate0	379.49	364.78	-3.87%
      rotate1	373.42	359.07	-3.84%
      rotate2	381.17	366.24	-3.91%
      rotate3	374.30	359.95	-3.83%
      
      CL 8445 was similar to this; gri asked that Val's implementation
      be hidden first. CLs 8912, 9263, and 9267 have at least
      isolated the changes to the cmd/internal/gc package.
      
      Updates #9933.
      
      Change-Id: I83ddfe003d48e0a73c92e819edd3b5e620023084
      Reviewed-on: https://go-review.googlesource.com/10059Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      13485be9
    • Josh Bleecher Snyder's avatar
      cmd/internal/gc: explicitly set zero bool Val · 3c06cff7
      Josh Bleecher Snyder authored
      This trivial change is a prerequisite to
      converting Val.U to an interface{}.
      
      No functional changes. Passes toolstash -cmp.
      
      Change-Id: I17ff036f68d29a9ed0097a8b23ae1c91e6ce8c21
      Reviewed-on: https://go-review.googlesource.com/10058Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      3c06cff7
    • Josh Bleecher Snyder's avatar
      cmd/5g, etc: prepare Node.Val to be unexported · ba577811
      Josh Bleecher Snyder authored
      Remove all uses of Node.Val outside of the gc package.
      
      A subsequent, automated commit in the Go 1.6 cycle
      will unexport Node.Val.
      
      No functional changes. Passes toolstash -cmp.
      
      Change-Id: Ia92ae6a7766c83ab3e45c69edab24a9581c824f9
      Reviewed-on: https://go-review.googlesource.com/9267Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      ba577811
    • Josh Bleecher Snyder's avatar
      cmd/5g, etc: prepare to unexport gc.Mp* · 0112f6f6
      Josh Bleecher Snyder authored
      Remove all uses of Mp* outside of the gc package.
      
      A subsequent, automated commit in the Go 1.6
      cycle will unexport all Mp* functions and types.
      
      No functional changes. Passes toolstash -cmp.
      
      Change-Id: Ie1604cb5b84ffb30b47f4777d4235570f2c62709
      Reviewed-on: https://go-review.googlesource.com/9263Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      0112f6f6
    • Russ Cox's avatar
      runtime: allocate map element zero values for reflect-created types on demand · 7e26a2d9
      Russ Cox authored
      Preallocating them in reflect means that
      (1) if you say _ = PtrTo(ArrayOf(1000000000, reflect.TypeOf(byte(0)))), you just allocated 1GB of data
      (2) if you say it again, that's *another* GB of data.
      
      The only use of t.zero in the runtime is for map elements.
      Delay the allocation until the creation of a map with that element type,
      and share the zeros.
      
      The one downside of the shared zero is that it's not garbage collected,
      but it's also never written, so the OS should be able to handle it fairly
      efficiently.
      
      Change-Id: I56b098a091abf3ac0945de28ebef9a6c08e76614
      Reviewed-on: https://go-review.googlesource.com/10111Reviewed-by: 's avatarKeith Randall <khr@golang.org>
      7e26a2d9
    • Russ Cox's avatar
      runtime: optimize heapBitsBulkBarrier a tiny amount · 65c4d7be
      Russ Cox authored
      This may be mostly noise but:
      
      name                   old mean              new mean              delta
      BinaryTree17            6.03s × (0.98,1.02)   5.98s × (0.97,1.03)    ~    (p=0.306)
      Fannkuch11              4.42s × (0.99,1.01)   4.34s × (0.99,1.02)  -1.83% (p=0.000)
      FmtFprintfEmpty        84.7ns × (0.99,1.01)  84.4ns × (1.00,1.00)    ~    (p=0.138)
      FmtFprintfString        289ns × (0.98,1.02)   289ns × (1.00,1.01)    ~    (p=0.509)
      FmtFprintfInt           280ns × (0.97,1.03)   272ns × (0.98,1.03)  -2.64% (p=0.003)
      FmtFprintfIntInt        484ns × (0.98,1.02)   482ns × (0.98,1.03)    ~    (p=0.606)
      FmtFprintfPrefixedInt   397ns × (0.98,1.03)   393ns × (0.99,1.02)    ~    (p=0.064)
      FmtFprintfFloat         573ns × (0.99,1.01)   569ns × (0.99,1.01)  -0.69% (p=0.023)
      FmtManyArgs            1.89µs × (0.99,1.02)  1.91µs × (0.98,1.02)    ~    (p=0.219)
      GobDecode              15.4ms × (0.99,1.02)  15.1ms × (0.99,1.01)  -2.05% (p=0.000)
      GobEncode              12.0ms × (0.97,1.04)  11.9ms × (0.97,1.03)    ~    (p=0.458)
      Gzip                    652ms × (0.99,1.01)   653ms × (0.99,1.01)    ~    (p=0.743)
      Gunzip                  144ms × (0.99,1.01)   143ms × (0.99,1.01)    ~    (p=0.134)
      HTTPClientServer       91.6µs × (0.99,1.01)  91.8µs × (0.99,1.03)    ~    (p=0.678)
      JSONEncode             31.9ms × (1.00,1.00)  32.0ms × (0.99,1.01)    ~    (p=0.334)
      JSONDecode              110ms × (0.99,1.01)   110ms × (0.99,1.01)    ~    (p=0.315)
      Mandelbrot200          6.04ms × (0.99,1.01)  6.04ms × (1.00,1.01)    ~    (p=0.596)
      GoParse                6.72ms × (0.98,1.03)  6.74ms × (0.99,1.03)    ~    (p=0.577)
      RegexpMatchEasy0_32     161ns × (0.99,1.01)   160ns × (1.00,1.00)  -0.83% (p=0.002)
      RegexpMatchEasy0_1K     542ns × (0.99,1.02)   541ns × (0.99,1.01)    ~    (p=0.396)
      RegexpMatchEasy1_32     140ns × (0.98,1.01)   137ns × (1.00,1.00)  -2.12% (p=0.000)
      RegexpMatchEasy1_1K     892ns × (0.99,1.01)   891ns × (1.00,1.01)    ~    (p=0.631)
      RegexpMatchMedium_32    255ns × (0.99,1.01)   253ns × (0.99,1.01)  -0.76% (p=0.008)
      RegexpMatchMedium_1K   73.1µs × (1.00,1.01)  72.9µs × (1.00,1.00)    ~    (p=0.229)
      RegexpMatchHard_32     3.86µs × (1.00,1.01)  3.85µs × (1.00,1.00)    ~    (p=0.341)
      RegexpMatchHard_1K      117µs × (1.00,1.01)   117µs × (0.99,1.00)    ~    (p=0.955)
      Revcomp                 954ms × (0.97,1.03)   955ms × (0.98,1.02)    ~    (p=0.894)
      Template                133ms × (0.97,1.05)   129ms × (0.99,1.02)  -2.50% (p=0.014)
      TimeParse               629ns × (0.99,1.01)   626ns × (0.99,1.01)    ~    (p=0.106)
      TimeFormat              663ns × (0.99,1.01)   660ns × (0.99,1.02)    ~    (p=0.231)
      
      Change-Id: I580e03ed01b0629cb5eae4c4637618f20127f924
      Reviewed-on: https://go-review.googlesource.com/9994Reviewed-by: 's avatarAustin Clements <austin@google.com>
      65c4d7be
    • Russ Cox's avatar
      runtime: use memmove during slice append · 497970f4
      Russ Cox authored
      The effect of this CL:
      
      name                   old mean              new mean              delta
      BinaryTree17            5.97s × (0.96,1.04)   5.95s × (0.98,1.02)    ~    (p=0.697)
      Fannkuch11              4.39s × (1.00,1.01)   4.41s × (1.00,1.01)  +0.52% (p=0.015)
      FmtFprintfEmpty        90.8ns × (0.97,1.05)  89.4ns × (0.94,1.13)    ~    (p=0.571)
      FmtFprintfString        305ns × (0.99,1.01)   292ns × (0.98,1.05)  -4.35% (p=0.000)
      FmtFprintfInt           278ns × (0.96,1.03)   279ns × (0.98,1.04)    ~    (p=0.741)
      FmtFprintfIntInt        489ns × (0.99,1.02)   482ns × (0.98,1.03)  -1.43% (p=0.024)
      FmtFprintfPrefixedInt   402ns × (0.98,1.02)   395ns × (0.98,1.03)  -1.67% (p=0.014)
      FmtFprintfFloat         578ns × (1.00,1.00)   569ns × (0.99,1.01)  -1.48% (p=0.000)
      FmtManyArgs            1.88µs × (0.99,1.01)  1.88µs × (1.00,1.01)    ~    (p=0.055)
      GobDecode              15.3ms × (0.99,1.01)  15.2ms × (1.00,1.01)  -0.61% (p=0.007)
      GobEncode              11.8ms × (0.98,1.05)  11.6ms × (0.99,1.01)    ~    (p=0.075)
      Gzip                    647ms × (0.99,1.01)   647ms × (1.00,1.00)    ~    (p=0.790)
      Gunzip                  143ms × (1.00,1.00)   142ms × (1.00,1.00)    ~    (p=0.370)
      HTTPClientServer       91.2µs × (0.99,1.01)  91.7µs × (0.99,1.02)    ~    (p=0.233)
      JSONEncode             31.5ms × (0.98,1.01)  31.8ms × (0.99,1.02)  +1.09% (p=0.015)
      JSONDecode              110ms × (0.99,1.01)   110ms × (0.99,1.02)    ~    (p=0.577)
      Mandelbrot200          6.00ms × (1.00,1.00)  6.02ms × (1.00,1.00)  +0.24% (p=0.001)
      GoParse                6.68ms × (0.98,1.02)  6.61ms × (0.99,1.01)  -1.10% (p=0.027)
      RegexpMatchEasy0_32     162ns × (1.00,1.00)   161ns × (1.00,1.01)  -0.66% (p=0.001)
      RegexpMatchEasy0_1K     539ns × (1.00,1.00)   539ns × (0.99,1.01)    ~    (p=0.509)
      RegexpMatchEasy1_32     140ns × (0.99,1.02)   139ns × (0.99,1.02)    ~    (p=0.163)
      RegexpMatchEasy1_1K     886ns × (1.00,1.00)   887ns × (1.00,1.00)    ~    (p=0.408)
      RegexpMatchMedium_32    252ns × (1.00,1.00)   255ns × (0.99,1.01)  +1.01% (p=0.000)
      RegexpMatchMedium_1K   72.6µs × (1.00,1.00)  72.6µs × (1.00,1.00)    ~    (p=0.176)
      RegexpMatchHard_32     3.84µs × (1.00,1.00)  3.84µs × (1.00,1.00)    ~    (p=0.403)
      RegexpMatchHard_1K      117µs × (1.00,1.00)   117µs × (1.00,1.00)    ~    (p=0.351)
      Revcomp                 926ms × (0.99,1.01)   925ms × (0.99,1.01)    ~    (p=0.541)
      Template                126ms × (0.99,1.02)   130ms × (0.99,1.01)  +3.42% (p=0.000)
      TimeParse               632ns × (0.99,1.01)   626ns × (1.00,1.00)  -0.88% (p=0.000)
      TimeFormat              658ns × (0.99,1.01)   662ns × (0.99,1.02)    ~    (p=0.111)
      
      The effect of this CL combined with CL 9886:
      
      name                   old mean              new mean              delta
      BinaryTree17            5.90s × (0.98,1.03)   5.95s × (0.98,1.02)    ~    (p=0.175)
      Fannkuch11              4.34s × (1.00,1.00)   4.41s × (1.00,1.01)  +1.69% (p=0.000)
      FmtFprintfEmpty        87.3ns × (0.97,1.17)  89.4ns × (0.94,1.13)    ~    (p=0.499)
      FmtFprintfString        288ns × (0.98,1.04)   292ns × (0.98,1.05)    ~    (p=0.292)
      FmtFprintfInt           290ns × (0.98,1.05)   279ns × (0.98,1.04)  -3.76% (p=0.001)
      FmtFprintfIntInt        493ns × (0.98,1.04)   482ns × (0.98,1.03)  -2.27% (p=0.017)
      FmtFprintfPrefixedInt   399ns × (0.98,1.02)   395ns × (0.98,1.03)    ~    (p=0.159)
      FmtFprintfFloat         569ns × (1.00,1.00)   569ns × (0.99,1.01)    ~    (p=0.847)
      FmtManyArgs            1.90µs × (0.99,1.03)  1.88µs × (1.00,1.01)  -1.14% (p=0.009)
      GobDecode              15.2ms × (1.00,1.01)  15.2ms × (1.00,1.01)    ~    (p=0.170)
      GobEncode              11.8ms × (0.99,1.02)  11.6ms × (0.99,1.01)  -1.47% (p=0.003)
      Gzip                    649ms × (0.99,1.00)   647ms × (1.00,1.00)    ~    (p=0.200)
      Gunzip                  144ms × (0.99,1.01)   142ms × (1.00,1.00)  -1.04% (p=0.000)
      HTTPClientServer       91.1µs × (0.98,1.03)  91.7µs × (0.99,1.02)    ~    (p=0.345)
      JSONEncode             31.5ms × (0.99,1.01)  31.8ms × (0.99,1.02)  +0.98% (p=0.021)
      JSONDecode              110ms × (1.00,1.01)   110ms × (0.99,1.02)    ~    (p=0.259)
      Mandelbrot200          6.02ms × (1.00,1.01)  6.02ms × (1.00,1.00)    ~    (p=0.500)
      GoParse                6.68ms × (1.00,1.01)  6.61ms × (0.99,1.01)  -1.17% (p=0.001)
      RegexpMatchEasy0_32     161ns × (1.00,1.00)   161ns × (1.00,1.01)  -0.39% (p=0.033)
      RegexpMatchEasy0_1K     539ns × (1.00,1.00)   539ns × (0.99,1.01)    ~    (p=0.445)
      RegexpMatchEasy1_32     138ns × (1.00,1.01)   139ns × (0.99,1.02)    ~    (p=0.281)
      RegexpMatchEasy1_1K     887ns × (1.00,1.01)   887ns × (1.00,1.00)    ~    (p=0.610)
      RegexpMatchMedium_32    251ns × (1.00,1.02)   255ns × (0.99,1.01)  +1.42% (p=0.000)
      RegexpMatchMedium_1K   72.7µs × (1.00,1.00)  72.6µs × (1.00,1.00)    ~    (p=0.097)
      RegexpMatchHard_32     3.85µs × (1.00,1.00)  3.84µs × (1.00,1.00)  -0.31% (p=0.000)
      RegexpMatchHard_1K      117µs × (1.00,1.00)   117µs × (1.00,1.00)    ~    (p=0.704)
      Revcomp                 923ms × (0.98,1.02)   925ms × (0.99,1.01)    ~    (p=0.574)
      Template                126ms × (0.98,1.03)   130ms × (0.99,1.01)  +3.28% (p=0.000)
      TimeParse               631ns × (0.99,1.02)   626ns × (1.00,1.00)    ~    (p=0.053)
      TimeFormat              660ns × (0.99,1.01)   662ns × (0.99,1.02)    ~    (p=0.398)
      
      Change-Id: I59c03d329fe7bc178a31477c6f1f01062b881041
      Reviewed-on: https://go-review.googlesource.com/9993Reviewed-by: 's avatarAustin Clements <austin@google.com>
      497970f4
    • David Symonds's avatar
      cmd/go: fix count of number of reserved names (doc change). · 3b214175
      David Symonds authored
      Change-Id: I2784f831453d929df64c66febb4982cdf1f08e06
      Reviewed-on: https://go-review.googlesource.com/10133Reviewed-by: 's avatarMinux Ma <minux@golang.org>
      3b214175
    • Patrick Mezard's avatar
      internal/syscall/windows/registry: fix read overrun in GetStringsValue · 335e44d2
      Patrick Mezard authored
      According to MSDN RegQueryValueEx page:
      
        If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type, the
        string may not have been stored with the proper terminating null
        characters. Therefore, even if the function returns ERROR_SUCCESS, the
        application should ensure that the string is properly terminated before
        using it; otherwise, it may overwrite a buffer. (Note that REG_MULTI_SZ
        strings should have two terminating null characters.)
      
      Test written by Alex Brainman <alex.brainman@gmail.com>
      
      Change-Id: I8c0852e0527e27ceed949134ed5e6de944189986
      Reviewed-on: https://go-review.googlesource.com/9806Reviewed-by: 's avatarAlex Brainman <alex.brainman@gmail.com>
      Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
      335e44d2
    • Shenghou Ma's avatar
      syscall: add test for Flock_t roundtrip · ed8ae792
      Shenghou Ma authored
      See CL 9962 for the rationale.
      
      Change-Id: I73c714fce258430eea1e61d3835f5c8e9014ca1f
      Signed-off-by: 's avatarShenghou Ma <minux@golang.org>
      Reviewed-on: https://go-review.googlesource.com/9925Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
      ed8ae792
    • Shenghou Ma's avatar
      syscall: add explicit build tags · 38631846
      Shenghou Ma authored
      Auto-generated using the following bash script:
      for i in z*_*_*.go; do
              goosgoarch=`basename ${i/${i/_*/}_/} .go`
              goos=${goosgoarch/_*/}
              goarch=${goosgoarch/*_/}
              echo $i $goos $goarch
              [ "$goos" = "windows" ] && continue
              sed -i -e "/^package /i\/\/ +build $goarch,$goos\n" "$i"
      done
      
      Change-Id: I756fee551d1698080e4591fed8f058ae0450aaa5
      Signed-off-by: 's avatarShenghou Ma <minux@golang.org>
      Reviewed-on: https://go-review.googlesource.com/10113Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
      38631846
    • Mikio Hara's avatar
      cmd/doc: fix build · 37eb1d19
      Mikio Hara authored
      Change-Id: Ic8437a1d2aeb424d6d5ce9e608c1293bba4c7bbc
      Reviewed-on: https://go-review.googlesource.com/10093
      Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
      Reviewed-by: 's avatarJosh Bleecher Snyder <josharian@gmail.com>
      37eb1d19