]> Cypherpunks repositories - gostls13.git/commitdiff
gofmt: race condition in error reporting and setting exit code
authorFazlul Shahriar <fshahriar@gmail.com>
Wed, 2 Dec 2009 21:02:42 +0000 (13:02 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 2 Dec 2009 21:02:42 +0000 (13:02 -0800)
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

index 47d03405e186e055f7ca8259ea67f5f9ee6443c7..683600ad76a1503c1f03f497b333d8044de853c9 100644 (file)
@@ -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
 }