Replace utils.Once with stdlib sync.OnceValue

This commit is contained in:
Kovid Goyal
2023-08-09 12:08:42 +05:30
parent 49ea26968c
commit 4f72bb9894
22 changed files with 53 additions and 96 deletions

View File

@@ -5,13 +5,14 @@ package utils
import (
"fmt"
"os"
"sync"
)
var _ = fmt.Print
var hostname string = "*"
var Hostname = Once(func() string {
var Hostname = sync.OnceValue(func() string {
h, err := os.Hostname()
if err == nil {
return h

View File

@@ -16,6 +16,7 @@ import (
"path/filepath"
"strconv"
"strings"
"sync"
"kitty/tools/utils"
"kitty/tools/utils/shm"
@@ -264,7 +265,7 @@ func OpenNativeImageFromReader(f io.ReadSeeker) (ans *ImageData, err error) {
return
}
var MagickExe = utils.Once(func() string {
var MagickExe = sync.OnceValue(func() string {
return utils.FindExe("magick")
})

View File

@@ -11,6 +11,7 @@ import (
"os"
"path/filepath"
"strings"
"sync"
"golang.org/x/sys/unix"
)
@@ -44,7 +45,7 @@ func load_mime_file(filename string, mime_map map[string]string) error {
return nil
}
var UserMimeMap = Once(func() map[string]string {
var UserMimeMap = sync.OnceValue(func() map[string]string {
conf_path := filepath.Join(ConfigDir(), "mime.types")
ans := make(map[string]string, 32)
err := load_mime_file(conf_path, ans)

View File

@@ -1,39 +0,0 @@
// License: GPLv3 Copyright: 2023, Kovid Goyal, <kovid at kovidgoyal.net>
package utils
import (
"fmt"
"sync"
"sync/atomic"
)
var _ = fmt.Print
type once[T any] struct {
done uint32
mutex sync.Mutex
cached_val T
Run func() T
}
func (self *once[T]) Get() T {
if atomic.LoadUint32(&self.done) == 0 {
self.do_slow()
}
return self.cached_val
}
func (self *once[T]) do_slow() {
self.mutex.Lock()
defer self.mutex.Unlock()
if atomic.LoadUint32(&self.done) == 0 {
defer atomic.StoreUint32(&self.done, 1)
self.cached_val = self.Run()
}
}
func Once[T any](f func() T) func() T {
return (&once[T]{Run: f}).Get
}

View File

@@ -1,24 +0,0 @@
// License: GPLv3 Copyright: 2023, Kovid Goyal, <kovid at kovidgoyal.net>
package utils
import (
"fmt"
"testing"
)
var _ = fmt.Print
func TestOnce(t *testing.T) {
num := 0
var G = Once(func() string {
num++
return fmt.Sprintf("%d", num)
})
G()
G()
G()
if num != 1 {
t.Fatalf("num unexpectedly: %d", num)
}
}

View File

@@ -10,6 +10,7 @@ import (
"runtime"
"strconv"
"strings"
"sync"
"howett.net/plist"
)
@@ -49,7 +50,7 @@ func ParsePasswdFile(path string) (ans map[string]PasswdEntry, err error) {
}
var passwd_err error
var passwd_database = Once(func() (ans map[string]PasswdEntry) {
var passwd_database = sync.OnceValue(func() (ans map[string]PasswdEntry) {
ans, passwd_err = ParsePasswdFile("/etc/passwd")
return
})
@@ -107,7 +108,7 @@ func parse_dscl_data(raw []byte) (ans map[string]PasswdEntry, err error) {
var dscl_error error
var dscl_user_database = Once(func() map[string]PasswdEntry {
var dscl_user_database = sync.OnceValue(func() map[string]PasswdEntry {
c := exec.Command("/usr/bin/dscl", "-plist", ".", "-readall", "/Users", "uid", "gid", "name", "realname", "home", "shell")
raw, err := c.Output()
if err != nil {

View File

@@ -16,6 +16,7 @@ import (
"sort"
"strconv"
"strings"
"sync"
"unicode/utf8"
"golang.org/x/sys/unix"
@@ -64,7 +65,7 @@ func Abspath(path string) string {
return path
}
var KittyExe = Once(func() string {
var KittyExe = sync.OnceValue(func() string {
exe, err := os.Executable()
if err == nil {
ans := filepath.Join(filepath.Dir(exe), "kitty")
@@ -119,11 +120,11 @@ func ConfigDirForName(name string) (config_dir string) {
return
}
var ConfigDir = Once(func() (config_dir string) {
var ConfigDir = sync.OnceValue(func() (config_dir string) {
return ConfigDirForName("kitty.conf")
})
var CacheDir = Once(func() (cache_dir string) {
var CacheDir = sync.OnceValue(func() (cache_dir string) {
candidate := ""
if edir := os.Getenv("KITTY_CACHE_DIRECTORY"); edir != "" {
candidate = Abspath(Expanduser(edir))
@@ -178,7 +179,7 @@ func macos_user_cache_dir() string {
return ""
}
var RuntimeDir = Once(func() (runtime_dir string) {
var RuntimeDir = sync.OnceValue(func() (runtime_dir string) {
var candidate string
if q := os.Getenv("KITTY_RUNTIME_DIRECTORY"); q != "" {
candidate = q

View File

@@ -7,13 +7,14 @@ import (
"os"
"path/filepath"
"strings"
"sync"
"golang.org/x/sys/unix"
)
var _ = fmt.Print
var DefaultExeSearchPaths = Once(func() []string {
var DefaultExeSearchPaths = sync.OnceValue(func() []string {
candidates := [...]string{"/usr/local/bin", "/opt/bin", "/opt/homebrew/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin"}
ans := make([]string, 0, len(candidates))
for _, x := range candidates {