From 0aa13c999b9c419d1d857db0f08e77c4a5d26a4a Mon Sep 17 00:00:00 2001 From: Fazlul Shahriar Date: Wed, 2 Dec 2009 13:02:42 -0800 Subject: [PATCH] gofmt: race condition in error reporting and setting exit code How to reproduce: $ mkdir /tmp/foo $ cp /dev/null /tmp/foo/bar.go $ chmod -r /tmp/foo/bar.go $ gofmt /tmp/foo open /tmp/foo/bar.go: permission denied $ echo $? # should echo 2 0 $ Maybe you need to put a call to time.Sleep at the beginning of report(). R=gri CC=golang-dev https://golang.org/cl/164073 --- src/cmd/gofmt/gofmt.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go index 47d03405e1..683600ad76 100644 --- a/src/cmd/gofmt/gofmt.go +++ b/src/cmd/gofmt/gofmt.go @@ -150,6 +150,7 @@ func (v fileVisitor) VisitFile(path string, d *os.Dir) { func walkDir(path string) { // start an error handler + done := make(chan bool); v := make(fileVisitor); go func() { for err := range v { @@ -157,10 +158,12 @@ func walkDir(path string) { report(err) } } + done <- true; }(); // walk the tree pathutil.Walk(path, v, v); - close(v); + close(v); // terminate error handler loop + <-done; // wait for all errors to be reported } -- 2.50.0