mirror of https://github.com/golang/go.git
os: cache Getwd result as hint for next time
Avoids the dot-dot-based algorithm on repeated calls when the directory hasn't changed. R=golang-dev, iant, bradfitz CC=golang-dev https://golang.org/cl/7340043
This commit is contained in:
parent
158a0353f7
commit
89fde30fbd
|
|
@ -5,9 +5,15 @@
|
|||
package os
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
var getwdCache struct {
|
||||
sync.Mutex
|
||||
dir string
|
||||
}
|
||||
|
||||
// Getwd returns a rooted path name corresponding to the
|
||||
// current directory. If the current directory can be
|
||||
// reached via multiple paths (due to symbolic links),
|
||||
|
|
@ -35,6 +41,17 @@ func Getwd() (pwd string, err error) {
|
|||
}
|
||||
}
|
||||
|
||||
// Apply same kludge but to cached dir instead of $PWD.
|
||||
getwdCache.Lock()
|
||||
pwd = getwdCache.dir
|
||||
getwdCache.Unlock()
|
||||
if len(pwd) > 0 {
|
||||
d, err := Stat(pwd)
|
||||
if err == nil && SameFile(dot, d) {
|
||||
return pwd, nil
|
||||
}
|
||||
}
|
||||
|
||||
// Root is a special case because it has no parent
|
||||
// and ends in a slash.
|
||||
root, err := Stat("/")
|
||||
|
|
@ -88,5 +105,11 @@ func Getwd() (pwd string, err error) {
|
|||
// Set up for next round.
|
||||
dot = pd
|
||||
}
|
||||
|
||||
// Save answer as hint to avoid the expensive path next time.
|
||||
getwdCache.Lock()
|
||||
getwdCache.dir = pwd
|
||||
getwdCache.Unlock()
|
||||
|
||||
return pwd, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue