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:
Russ Cox 2013-02-14 14:21:09 -05:00
parent 158a0353f7
commit 89fde30fbd
1 changed files with 23 additions and 0 deletions

View File

@ -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
}