Make the various path finding functions thread safe and cache their results

This commit is contained in:
Kovid Goyal 2023-01-25 16:24:27 +05:30
parent a01d68ed85
commit e3040a9c91
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -9,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings" "strings"
"sync"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -56,21 +57,26 @@ func Abspath(path string) string {
return path return path
} }
var config_dir string var config_dir, kitty_exe, cache_dir string
var kitty_exe_err error
var config_dir_once, kitty_exe_once, cache_dir_once sync.Once
func find_kitty_exe() {
exe, err := os.Executable()
if err == nil {
kitty_exe = filepath.Join(filepath.Dir(exe), "kitty")
kitty_exe_err = unix.Access(kitty_exe, unix.X_OK)
} else {
kitty_exe_err = err
}
}
func KittyExe() (string, error) { func KittyExe() (string, error) {
exe, err := os.Executable() kitty_exe_once.Do(find_kitty_exe)
if err != nil { return kitty_exe, kitty_exe_err
return "", err
}
ans := filepath.Join(filepath.Dir(exe), "kitty")
return ans, unix.Access(ans, unix.X_OK)
} }
func ConfigDir() string { func find_config_dir() {
if config_dir != "" {
return config_dir
}
if os.Getenv("KITTY_CONFIG_DIRECTORY") != "" { if os.Getenv("KITTY_CONFIG_DIRECTORY") != "" {
config_dir = Abspath(Expanduser(os.Getenv("KITTY_CONFIG_DIRECTORY"))) config_dir = Abspath(Expanduser(os.Getenv("KITTY_CONFIG_DIRECTORY")))
} else { } else {
@ -98,16 +104,14 @@ func ConfigDir() string {
} }
} }
} }
}
func ConfigDir() string {
config_dir_once.Do(find_config_dir)
return config_dir return config_dir
} }
var cache_dir string func find_cache_dir() {
func CacheDir() string {
if cache_dir != "" {
return cache_dir
}
candidate := "" candidate := ""
if edir := os.Getenv("KITTY_CACHE_DIRECTORY"); edir != "" { if edir := os.Getenv("KITTY_CACHE_DIRECTORY"); edir != "" {
candidate = Abspath(Expanduser(edir)) candidate = Abspath(Expanduser(edir))
@ -121,7 +125,12 @@ func CacheDir() string {
candidate = filepath.Join(Expanduser(candidate), "kitty") candidate = filepath.Join(Expanduser(candidate), "kitty")
} }
os.MkdirAll(candidate, 0o755) os.MkdirAll(candidate, 0o755)
return candidate cache_dir = candidate
}
func CacheDir() string {
cache_dir_once.Do(find_cache_dir)
return cache_dir
} }
type Walk_callback func(path, abspath string, d fs.DirEntry, err error) error type Walk_callback func(path, abspath string, d fs.DirEntry, err error) error