1
0
mirror of https://github.com/golang/go synced 2024-11-18 18:54:42 -07:00
The Go programming language
Go to file
Bryan C. Mills 165bdd618e imports: fix races in findImportGoPath
Before this change, findImportGoPath used a field within the
(otherwise read-only) structs in the dirScan map to cache the distance
from the importing package to the candidate package to be imported. As
a result, the top-level imports.Process function was not safe to call
concurrently: one goroutine could overwrite the distances while
another was attempting to sort by them. Furthermore, there were some
internal write-after-write races (writing the same cached distance to
the same address) that otherwise violate the Go memory model.

This change fixes those races, simplifies the concurrency patterns,
and clarifies goroutine lifetimes. The functions in the imports
package now wait for the goroutines they spawn to finish before
returning, eliminating the need for an awkward test-only mutex that
could otherwise mask real races in the production code paths.

See also:
https://golang.org/wiki/CodeReviewComments#goroutine-lifetimes
https://golang.org/wiki/CodeReviewComments#synchronous-functions

Fixes golang/go#25030.

Change-Id: I8fec735e0d4ff7abab406dea9d0c11d1bd93d775
Reviewed-on: https://go-review.googlesource.com/109156
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
2018-04-30 20:17:55 +00:00
benchmark/parse benchmark/parse: fix cosmetic defect in error str. 2015-02-02 17:07:43 +00:00
blog godoc,blog: perform minor cleanup 2018-04-14 19:30:04 +00:00
cmd cmd/guru: always import tests in initial referrers import 2018-04-23 20:00:06 +00:00
container/intsets x/tools/container/intsets: add LowerBound 2017-08-21 16:11:21 +00:00
cover cover: handle multiple samples from the same location 2017-12-10 23:11:56 +00:00
go go/internal/gcimporter: support indexed export data 2018-04-26 19:07:32 +00:00
godoc godoc: remove vendor prefixes for border-radius 2018-04-28 22:29:17 +00:00
imports imports: fix races in findImportGoPath 2018-04-30 20:17:55 +00:00
internal/fastwalk imports: extract fastWalk into new package internal/fastwalk 2018-04-16 19:53:52 +00:00
playground playground/socket: deflake test, remove sleep 2016-12-11 02:33:14 +00:00
present cmd/present: display slide numbers 2018-04-13 16:54:21 +00:00
refactor refactor/eg: Add support for multi line after statements to eg. 2018-03-19 17:51:41 +00:00
third_party cmd/heapview: dowgrade to customelements v0 2016-08-05 20:49:36 +00:00
.gitattributes tools: copying .gitattributes to all subrepositories (fixes windows build) 2014-12-23 06:32:51 +00:00
.gitignore .gitignore: roll back ".gitignore: ignore emacs backup files" 2018-02-13 00:43:28 +00:00
AUTHORS go.empty: prototype for new subrepository 2012-01-25 14:45:13 -05:00
codereview.cfg tools: add codereview.cfg 2015-03-18 17:04:00 +00:00
CONTRIBUTING.md CONTRIBUTING.md: remove note about not accepting Pull Requests 2018-03-14 18:02:17 +00:00
CONTRIBUTORS go.empty: prototype for new subrepository 2012-01-25 14:45:13 -05:00
LICENSE LICENSE: add 2012-03-17 15:20:58 +11:00
PATENTS go.empty: add PATENTS file to the subrepo. 2012-04-16 11:24:04 +10:00
README.md README: switch to Markdown and add links 2017-09-27 05:40:07 +00:00

Go Tools

This subrepository holds the source for various packages and tools that support the Go programming language.

Some of the tools, godoc and vet for example, are included in binary Go distributions.

Others, including the Go guru and the test coverage tool, can be fetched with go get.

Packages include a type-checker for Go and an implementation of the Static Single Assignment form (SSA) representation for Go programs.

Download/Install

The easiest way to install is to run go get -u golang.org/x/tools/.... You can also manually git clone the repository to $GOPATH/src/golang.org/x/tools.

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://golang.org/doc/contribute.html.

The main issue tracker for the tools repository is located at https://github.com/golang/go/issues. Prefix your issue with "x/tools/(your subdir):" in the subject line, so it is easy to find.