1. 19 Jul, 2019 1 commit
    • Austin Clements's avatar
      runtime: align allocations harder in GODEBUG=sbrk=1 mode · 5b15510d
      Austin Clements authored
      Currently, GODEBUG=sbrk=1 mode aligns allocations by their type's
      alignment. You would think this would be the right thing to do, but
      because 64-bit fields are only 4-byte aligned right now (see #599),
      this can cause a 64-bit field of an allocated object to be 4-byte
      aligned, but not 8-byte aligned. If there is an atomic access to that
      unaligned 64-bit field, it will crash.
      
      This doesn't happen in normal allocation mode because the
      size-segregated allocation and the current size classes will cause any
      types larger than 8 bytes to be 8 byte aligned.
      
      We fix this by making sbrk=1 mode use alignment based on the type's
      size rather than its declared alignment. This matches how the tiny
      allocator aligns allocations.
      
      This was tested with
      
        GOARCH=386 GODEBUG=sbrk=1 go test sync/atomic
      
      This crashes with an unaligned access before this change, and passes
      with this change.
      
      This should be reverted when/if we fix #599.
      
      Fixes #33159.
      
      Change-Id: Ifc52c72c6b99c5d370476685271baa43ad907565
      Reviewed-on: https://go-review.googlesource.com/c/go/+/186919
      Run-TryBot: Austin Clements <austin@google.com>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      5b15510d
  2. 18 Jul, 2019 7 commits
  3. 17 Jul, 2019 4 commits
    • Jay Conrod's avatar
      cmd/go: include GOEXPERIMENT flags in tool id for cache key · 4814e7d5
      Jay Conrod authored
      The go command invokes each tool with -V=full to discover its version
      to compute a tool id. For release versions (that don't include the
      word "devel"), the go command only used the third word in
      the output (e.g., "go1.13"), ignoring any toolchain experiments that
      followed. With this change, the go command will use whole version line
      in the tool id for release versions.
      
      Also, when -V=full is set and there are non-default experiments,
      experiments are no longer printed twice.
      
      Fixes #33091
      
      Change-Id: I19b96f939c7e2fbc5d8befe3659156ee4b58daef
      Reviewed-on: https://go-review.googlesource.com/c/go/+/186200
      Run-TryBot: Jay Conrod <jayconrod@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
      4814e7d5
    • Joe Tsai's avatar
      net/http/httputil: fix regression in ReverseProxy.ServeHTTP · f93234ad
      Joe Tsai authored
      In Go1.12 and below, the logic in ReverseProxy.ServeHTTP would always
      allocate request.Header even if it were not present in the incoming request.
      CL 174324 added http.Request.Clone and re-factors ReverseProxy.ServeHTTP
      to use the new Clone method. However, the new Clone logic is not equivalent
      to the former logic. We preserve former semantics by explicitly allocating
      the Header map if nil.
      
      Fixes #33142
      
      Change-Id: I356f94a915dd9779584ce3fe31e56e5474b9ad37
      Reviewed-on: https://go-review.googlesource.com/c/go/+/186437
      Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAndrew Bonventre <andybons@golang.org>
      f93234ad
    • Alberto Donizetti's avatar
      doc/go1.13: remove 1.12 reference from 1.13 release notes · 5bc46cb7
      Alberto Donizetti authored
      While it's true that CL 168479 was also backported to 1.12, this is
      irrelevant for the Go1.13 release notes.
      
      Change-Id: I044be69f8f2bc005f58a0d63db05129add15f674
      Reviewed-on: https://go-review.googlesource.com/c/go/+/186138Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      5bc46cb7
    • Dmitri Shuralyov's avatar
      CONTRIBUTORS: first round of updates for Go 1.13 · b5df14c3
      Dmitri Shuralyov authored
      This update has been automatically generated using the updatecontrib
      command:
      
      	cd gotip
      	go run golang.org/x/build/cmd/updatecontrib
      
      With minor manual changes to canonicalize letter case for a few names.
      
      Actions taken (relative to CONTRIBUTORS at origin/master):
      
      	Added Ahsun Ahmed <ahmed.ahsun@gmail.com>
      	Added Al Cutter <al@google.com>
      	Added Alex Tokarev <aleksator@gmail.com>
      	Added Alexander Lourier <aml@rulezz.ru>
      	Added Alexander Rakoczy <alex@golang.org>
      	Added Andrei Matei <andrei@cockroachlabs.com>
      	Added Andrei Vagin <avagin@google.com>
      	Added Andrew Z Allen <me@andrewzallen.com>
      	Added Aofei Sheng <aofei@aofeisheng.com>
      	Added Arash Bina <arash@arash.io>
      	Added Benjamin Peterson <benjamin@python.org>
      	Added Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
      	Added Brandon Ryan <bjryan19@gmail.com>
      	Added Bryan Heden <b.heden@gmail.com>
      	Added Carlos Eduardo <me@carlosedp.com>
      	Added Carrie Bynon <cbynon@gmail.com>
      	Added Chris Marchesi <chrism@vancluevertech.com>
      	Added Colin Arnott <colin@urandom.co.uk>
      	Added Daniel Cormier <danielc@knowbe4.com>
      	Added Daniel Langner <s8572327@gmail.com>
      	Added Daniel Lublin <daniel@lublin.se>
      	Added Darren Grant <darren.e.grant@gmail.com>
      	Added Derek Phan <derekphan94@gmail.com>
      	Added Dmitri Goutnik <dgoutnik@gmail.com>
      	Added Dmitry Mottl <dmitry.mottl@gmail.com>
      	Added Eli Bendersky <eliben@google.com>
      	Added Evan Digby <evandigby@gmail.com>
      	Added Fedor Korotkiy <dartslon@gmail.com>
      	Added Felix Bünemann <Felix.Buenemann@gmail.com>
      	Added Francesco Renzi <rentziass@gmail.com>
      	Added Gabriel Guzman <gabe.guzman@gmail.com>
      	Added Gabriel Nelle <tehsphinx@web.de>
      	Added Gernot Vormayr <gvormayr@gmail.com>
      	Added GitHub User ZZMarquis (7624583) <zhonglingjian3821@163.com>
      	Added GitHub User alkesh26 (1019076) <alkesh26@gmail.com>
      	Added GitHub User bakape (7851952) <bakape@gmail.com>
      	Added GitHub User frennkie (6499251) <mail@rhab.de>
      	Added GitHub User hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
      	Added GitHub User kazyshr (30496953) <kazyshr0301@gmail.com>
      	Added GitHub User linguohua (3434367) <lghchinaidea@gmail.com>
      	Added GitHub User micnncim (21333876) <micnncim@gmail.com>
      	Added Gordon Tyler <gordon@doxxx.net>
      	Added Greg Thelen <gthelen@google.com>
      	Added Haosdent Huang <haosdent@gmail.com>
      	Added Hasan Ozgan <hasan@ozgan.net>
      	Added Henry Wong <liushuai.wang@elastic.co>
      	Added Horst Rutter <hhrutter@gmail.com>
      	Added Ivan Osadchiy <ivan.osadchii@gmail.com>
      	Added JT Olio <hello@jtolio.com>
      	Added Jacob Blain Christen <dweomer5@gmail.com>
      	Added Jacob Walker <jacobwalker0814@gmail.com>
      	Added James Nugent <james@jen20.com>
      	Added Jannis Andrija Schnitzer <jannis@schnitzer.im>
      	Added Jean-François Bustarret <jf@bustarret.com>
      	Added Jeremy Jay <jeremy@pbnjay.com>
      	Added Jeroen Simonetti <jeroen@simonetti.nl>
      	Added Jingnan Si <jingnan.si@gmail.com>
      	Added Jinkun Zhang <franksnolf@gmail.com>
      	Added John Moore <johnkenneth.moore@gmail.com>
      	Added John Weldon <johnweldon4@gmail.com>
      	Added Jonathon Lacher <jonathon.lacher@gmail.com>
      	Added Jordan Liggitt <liggitt@google.com>
      	Added Joshua M. Clulow <josh.clulow@joyent.com>
      	Added Juraj Sukop <sukop@users.noreply.github.com>
      	Added Justin Li <git@justinli.net>
      	Added Kai Dong <dokia2357@gmail.com>
      	Added Kenichi Tsunokawa <kenichi.tsunokawa@gmail.com>
      	Added Kenta Mori <zoncoen@gmail.com>
      	Added Ketan Parmar <ketanbparmar@gmail.com>
      	Added Kirill Motkov <Motkov.Kirill@gmail.com>
      	Added Kshitij Saraogi <kshitijsaraogi@gmail.com>
      	Added Leonardo Comelli <leonardo.comelli@gmail.com>
      	Added Lorenz Nickel <mail@lorenznickel.de>
      	Added Luka Zitnik <luka.zitnik@gmail.com>
      	Added Luke Champine <luke.champine@gmail.com>
      	Added Madhu Rajanna <madhupr007@gmail.com>
      	Added Marat Khabibullin <marat.khabibullin@jetbrains.com>
      	Added Mark Villacampa <m@markvillacampa.com>
      	Added Max Semenik <maxsem.wiki@gmail.com>
      	Added Maxim Eryomenko <moeryomenko@gmail.com>
      	Added Michael Cook <code@mdcook.net>
      	Added Michael Vogt <mvo@ubuntu.com>
      	Added Mickael KERJEAN <mickael.kerjean@gmail.com>
      	Added Mickey Reiss <mickeyreiss@gmail.com>
      	Added Mihai Moldovan <ionic@ionic.de>
      	Added Mirko Hansen <baaazen@gmail.com>
      	Added Muir Manders <muir@mnd.rs>
      	Added Mykhailo Lesyk <mikhail@lesyk.org>
      	Added Nick Anthony <Liberatys@outlook.com>
      	Added Nikita Kryuchkov <nkryuchkov10@gmail.com>
      	Added Nir Soffer <nirsof@gmail.com>
      	Added Norman B. Lancaster <qbradq@gmail.com>
      	Added Patrick Barker <barkerp@vmware.com>
      	Added Patrik Lundin <patrik@sigterm.se>
      	Added Petr Jediný <petr.jediny@gmail.com>
      	Added Robert Ayrapetyan <robert.ayrapetyan@gmail.com>
      	Added Robert van Gent <rvangent@google.com>
      	Added Rohan Verma <rohanverma2004@gmail.com>
      	Added Romain Baugue <romain.baugue@elwinar.com>
      	Added Sad Pencil <qh06@qq.com>
      	Added Segev Finer <segev208@gmail.com>
      	Added Sergey Dobrodey <sergey.dobrodey@synesis.ru>
      	Added Sergey Yanykin <syanykin@ozon.ru>
      	Added Shawn Elliott <selliott@microsoft.com>
      	Added Shengjing Zhu <zsj950618@gmail.com>
      	Added Shubham Sharma <shubham.sha12@gmail.com>
      	Added Stephan Zuercher <zuercher@gmail.com>
      	Added Steve Mynott <steve.mynott@gmail.com>
      	Added Tai Le <letientai299@gmail.com>
      	Added Todd Kulesza <tkulesza@google.com>
      	Added Tom Anthony <git@tomanthony.co.uk>
      	Added Tooru Takahashi <tooru.takahashi134@gmail.com>
      	Added Udalov Max <re.udalov@gmail.com>
      	Added Valentin Vidic <vvidic@valentin-vidic.from.hr>
      	Added Vivek Sekhar <vsekhar@google.com>
      	Added WEI Xikai <xykwei@gmail.com>
      	Added Wenlei (Frank) He <wlhe@google.com>
      	Added Wenzel Lowe <lowewenzel@gmail.com>
      	Added Yang Tian <linuxty@gmail.com>
      	Added Yasser Abdolmaleki <yasser@yasser.ca>
      	Added Zach Jones <zachj1@gmail.com>
      	Added adarsh ravichandran <adarshravichandran91@gmail.com>
      	Added berkant ipek <41230766+0xbkt@users.noreply.github.com>
      	Added karthik nayak <karthik.188@gmail.com>
      	Added marius a. eriksen <marius@grailbio.com>
      	Added Максадбек Ахмедов <a.maksadbek@gmail.com>
      	Used GitHub User ZZMarquis (7624583) form for ZZMarquis <zhonglingjian3821@163.com> https://github.com/golang/go/commit/b00ef3b865 [go]
      	Used GitHub User alkesh26 (1019076) form for alkesh26 <alkesh26@gmail.com> https://github.com/golang/go/commit/c7f69a2897 [go]
      	Used GitHub User bakape (7851952) form for bakape <bakape@gmail.com> https://github.com/golang/go/commit/27e444d5e6 [go]
      	Used GitHub User frennkie (6499251) form for frennkie <mail@rhab.de> https://github.com/golang/go/commit/ee46250e06 [go]
      	Used GitHub User hengwu0 (41297446) form for hengwu0 <41297446+hengwu0@users.noreply.github.com> https://github.com/golang/go/commit/95d4e6158b [go]
      	Used GitHub User kazyshr (30496953) form for kazyshr <kazyshr0301@gmail.com> https://github.com/golang/tools/commit/0fdf0c73 [tools]
      	Used GitHub User linguohua (3434367) form for linguohua <lghchinaidea@gmail.com> https://github.com/golang/tools/commit/97de5656 [tools]
      	Used GitHub User micnncim (21333876) form for micnncim <micnncim@gmail.com> https://github.com/golang/tools/commit/15d5d381 [tools]
      	Used GitHub name "Akhil Indurti" for smasher164 <aindurti@gmail.com> https://github.com/golang/go/commit/5ca44dc403 [build go]
      	Used GitHub name "Carlos Eduardo" for CarlosEDP <me@carlosedp.com> https://github.com/golang/net/commit/018c4d4 [net]
      	Used GitHub name "Ivan Markin" for nogoegst <nogoegst@users.noreply.github.com> https://github.com/golang/go/commit/a1addf15df [go]
      	Used GitHub name "Jean-François Bustarret" for jfbus <jf@bustarret.com> https://github.com/golang/go/commit/825ff1e317 [go]
      	Used GitHub name "Jinkun Zhang" for smileeye <franksnolf@gmail.com> https://github.com/golang/go/commit/607493bed6 [go]
      	Used GitHub name "John Moore" for guitarbum722 <johnkenneth.moore@gmail.com> https://github.com/golang/go/commit/44c9354c5a [go]
      	Used GitHub name "Keiji Yoshida" for yosssi <yoshida.keiji.84@gmail.com> https://github.com/golang/lint/commit/ac6833c [lint]
      	Used GitHub name "Kenta Mori" for zoncoen <zoncoen@gmail.com> https://github.com/golang/net/commit/fe579d4 [net]
      	Used GitHub name "Kirill Motkov" for Motkov.Kirill <Motkov.Kirill@gmail.com> https://github.com/golang/go/commit/0ff0df8be3 [go]
      	Used GitHub name "Luke Champine" for lukechampine <luke.champine@gmail.com> https://github.com/golang/go/commit/9d40fadb1c [crypto go]
      	Used GitHub name "Michalis Kargakis" for kargakis <mkargaki@redhat.com> https://github.com/golang/go/commit/e243d242d7 [go]
      	Used GitHub name "Nick Anthony" for Liberatys <Liberatys@outlook.com> https://github.com/golang/go/commit/62ddf7d0c5 [go]
      	Used GitHub name "Robert Ayrapetyan" for rayrapetyan <robert.ayrapetyan@gmail.com> https://github.com/golang/sys/commit/bf70e46 [sys]
      	Used GitHub name "Robin Eklind" for mewmew <rnd0x00@gmail.com> https://github.com/golang/go/commit/b8620afb8d [blog go proposal.git]
      	Used GitHub name "Sergey Dobrodey" for sergeydobrodey <sergey.dobrodey@synesis.ru> https://github.com/golang/net/commit/e869164 [net]
      	Used GitHub name "Tai Le" for Tai <letientai299@gmail.com> https://github.com/golang/build/commit/1b388d2 [build tools]
      	Used GitHub name "WEI Xikai" for ShiKaiWi <xykwei@gmail.com> https://github.com/golang/go/commit/518ee55d78 [go]
      	Used GitHub name "Yang Tian" for taoyuanyuan <linuxty@gmail.com> https://github.com/golang/go/commit/5eeb372418 [go]
      	Used GitHub name "Zach Jones" for zdjones <zachj1@gmail.com> https://github.com/golang/go/commit/c178389604 [go]
      
      Updates #12042
      
      Change-Id: Ic220d997a0dc3bf4109ab964cbb6a25ea5c0c9da
      Reviewed-on: https://go-review.googlesource.com/c/go/+/186397Reviewed-by: default avatarAlexander Rakoczy <alex@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      b5df14c3
  4. 16 Jul, 2019 4 commits
  5. 15 Jul, 2019 6 commits
  6. 14 Jul, 2019 1 commit
  7. 12 Jul, 2019 3 commits
  8. 11 Jul, 2019 2 commits
  9. 10 Jul, 2019 6 commits
  10. 09 Jul, 2019 2 commits
    • Gernot Vormayr's avatar
      cmd/cgo: fix check for conversion of ptr to struct field · 84fce983
      Gernot Vormayr authored
      According to the documentation "When passing a pointer to a field in a
      struct, the Go memory in question is the memory occupied by the field,
      not the entire struct.". checkAddr states that this should also work
      with type conversions, which is implemented in isType. However,
      ast.StarExpr must be enclosed in ast.ParenExpr according to the go spec
      (see example below), which is not considered in the checks.
      
      Example:
          // struct Si { int i; int *p; }; void f(struct I *x) {}
          import "C"
          type S {
              p *int
              i C.struct_Si
          }
          func main() {
              v := &S{new(int)}
              C.f((*C.struct_I)(&v.i)) // <- panic
          }
      
      This example will cause cgo to emit a cgoCheck that checks the whole
      struct S instead of just S.i causing the panic "cgo argument has Go
      pointer to Go pointer".
      
      This patch fixes this situation by adding support for ast.ParenExpr to
      isType and adds a test, that fails without the fix.
      
      Fixes #32970.
      
      Change-Id: I15ea28c98f839e9fa708859ed107a2e5f1483133
      Reviewed-on: https://go-review.googlesource.com/c/go/+/185098
      Run-TryBot: Ian Lance Taylor <iant@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      84fce983
    • LE Manh Cuong's avatar
      cmd/compile: fix unsafeValue handles OLSH/ORSH wrong · 06ef108c
      LE Manh Cuong authored
      For OLSH/ORSH, the right node is not a uintptr-typed. However,
      unsafeValue still be called recursively for it, causing the
      compiler crashes.
      
      To fixing, the right node only needs to be evaluated
      for side-effects, so just discard its value.
      
      Fixes #32959
      
      Change-Id: I34d5aa0823a0545f6dad1ec34774235ecf11addc
      Reviewed-on: https://go-review.googlesource.com/c/go/+/185039
      Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarDavid Chase <drchase@google.com>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      06ef108c
  11. 08 Jul, 2019 4 commits
    • Agniva De Sarker's avatar
      Revert "go/parser: include more comments in a struct or interface" · a19c0ced
      Agniva De Sarker authored
      This reverts commit https://golang.org/cl/161177/.
      
      Reason for revert: this led to non-contiguous comments spaced
      by an empty line to be grouped into a single CommentGroup
      
      Fixes #32944
      Updates #10858
      
      Change-Id: I5e16663b308c3b560496da8e66c33befdf9ed9dd
      Reviewed-on: https://go-review.googlesource.com/c/go/+/185040Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      a19c0ced
    • Alexander Rakoczy's avatar
      doc: document Go 1.12.7 · c893ea8f
      Alexander Rakoczy authored
      Change-Id: Id5d2f4cc6bc310bed2516ce0f50c395802475f66
      Reviewed-on: https://go-review.googlesource.com/c/go/+/185258Reviewed-by: default avatarDmitri Shuralyov <dmitshur@golang.org>
      c893ea8f
    • Alexander Rakoczy's avatar
      doc: document Go 1.11.12 · 0fddd668
      Alexander Rakoczy authored
      Change-Id: I1b2e369befc58b3f88ac201442a2d9f76d87d54e
      Reviewed-on: https://go-review.googlesource.com/c/go/+/185257Reviewed-by: default avatarDmitri Shuralyov <dmitshur@golang.org>
      0fddd668
    • Russ Cox's avatar
      net/http: fix Transport.MaxConnsPerHost limits & idle pool races · fbaf881c
      Russ Cox authored
      There were at least three races in the implementation of the pool of
      idle HTTP connections before this CL.
      
      The first race is that HTTP/2 connections can be shared for many
      requests, but each requesting goroutine would take the connection out
      of the pool and then immediately return it before using it; this
      created unnecessary, tiny little race windows during which another
      goroutine might dial a second connection instead of reusing the first.
      This CL changes the idle pool to just leave the HTTP/2 connection in
      the pool permanently (until there is reason to close it), instead of
      doing the take-it-out-put-it-back dance race.
      
      The second race is that “is there an idle connection?” and
      “register to wait for an idle connection” were implemented as two
      separate steps, in different critical sections. So a client could end
      up registered to wait for an idle connection and be waiting or perhaps
      dialing, not having noticed the idle connection sitting in the pool
      that arrived between the two steps.
      
      The third race is that t.getIdleConnCh assumes that the inability to
      send on the channel means the client doesn't need the result, when it
      could mean that the client has not yet entered the select.
      That is, the main dial does:
      
      	idleConnCh := t.getIdleConnCh(cm)
      	select {
      	case v := <-dialc:
      		...
      	case pc := <-idleConnCh
      		...
      	...
      	}
      
      But then tryPutIdleConn does:
      
      	waitingDialer := t.idleConnCh[key] // what getIdleConnCh(cm) returned
      	select {
      	case waitingDialer <- pconn:
      		// We're done ...
      		return nil
      	default:
      		if waitingDialer != nil {
      			// They had populated this, but their dial won
      			// first, so we can clean up this map entry.
      			delete(t.idleConnCh, key)
      		}
      	}
      
      If the client has returned from getIdleConnCh but not yet reached the
      select, tryPutIdleConn will be unable to do the send, incorrectly
      conclude that the client does not care anymore, and put the connection
      in the idle pool instead, again leaving the client dialing unnecessarily
      while a connection sits in the idle pool.
      
      (It's also odd that the success case does not clean up the map entry,
      and also that the map has room for only a single waiting goroutine for
      a given host.)
      
      None of these races mattered too much before Go 1.11: at most they
      meant that connections were not reused quite as promptly as possible,
      or a few more than necessary would be created. But Go 1.11 added
      Transport.MaxConnsPerHost, which limited the number of connections
      created for a given host. The default is 0 (unlimited), but if a user
      did explicitly impose a low limit (2 is common), all these misplaced
      conns could easily add up to the entire limit, causing a deadlock.
      This was causing intermittent timeouts in TestTransportMaxConnsPerHost.
      
      The addition of the MaxConnsPerHost support added its own races.
      
      For example, here t.incHostConnCount could increment the count
      and return a channel ready for receiving, and then the client would
      not receive from it nor ever issue the decrement, because the select
      need not evaluate these two cases in order:
      
      	select {
      	case <-t.incHostConnCount(cmKey):
      		// count below conn per host limit; proceed
      	case pc := <-t.getIdleConnCh(cm):
      		if trace != nil && trace.GotConn != nil {
      			trace.GotConn(httptrace.GotConnInfo{Conn: pc.conn, Reused: pc.isReused()})
      		}
      		return pc, nil
      	...
      	}
      
      Obviously, unmatched increments are another way to get to a deadlock.
      TestTransportMaxConnsPerHost deadlocked approximately 100% of
      the time with a small random sleep added between incHostConnCount
      and the select:
      
      	ch := t.incHostConnCount(cmKey):
      	time.Sleep(time.Duration(rand.Intn(10))*time.Millisecond)
      	select {
      	case <-ch
      		// count below conn per host limit; proceed
      	case pc := <-t.getIdleConnCh(cm):
      		...
      	}
      
      The limit also did not properly apply to HTTP/2, because of the
      decrement being attached to the underlying net.Conn.Close
      and net/http not having access to the underlying HTTP/2 conn.
      The alternate decrements for HTTP/2 may also have introduced
      spurious decrements (discussion in #29889). Perhaps those
      spurious decrements or other races caused the other intermittent
      non-deadlock failures in TestTransportMaxConnsPerHost,
      in which the HTTP/2 phase created too many connections (#31982).
      
      This CL replaces the buggy, racy code with new code that is hopefully
      neither buggy nor racy.
      
      Fixes #29889.
      Fixes #31982.
      Fixes #32336.
      
      Change-Id: I0dfac3a6fe8a6cdf5f0853722781fe2ec071ac97
      Reviewed-on: https://go-review.googlesource.com/c/go/+/184262
      Run-TryBot: Russ Cox <rsc@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
      fbaf881c