From 89fde30fbda9a86a7b53db7b7cee1cfd8e1a36ff Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 14 Feb 2013 14:21:09 -0500 Subject: [PATCH] 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 --- src/pkg/os/getwd.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/pkg/os/getwd.go b/src/pkg/os/getwd.go index 81d8fed926..1b22123068 100644 --- a/src/pkg/os/getwd.go +++ b/src/pkg/os/getwd.go @@ -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 } -- 2.48.1