From baa893c8f6bc6c125ad965bdb052ff1bd310570b Mon Sep 17 00:00:00 2001 From: Kenneth Shaw Date: Thu, 3 Oct 2019 07:30:27 +0700 Subject: [PATCH] Fixes a concurrency issue with go module package path cache The `chromedp-gen` tool, which makes use of the raw code, always encounters issues with slow builds. This adds a simple `sync.RWMutex` to the Go module map package path cache variable that's causing problems. --- parser/pkgpath.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/parser/pkgpath.go b/parser/pkgpath.go index 155d168..b2fdea8 100644 --- a/parser/pkgpath.go +++ b/parser/pkgpath.go @@ -90,19 +90,27 @@ func getPkgPathFromGoMod(fname string, isDir bool, goModPath string) (string, er return path.Clean(rel), nil } -var ( - modulePrefix = []byte("\nmodule ") - pkgPathFromGoModCache = make(map[string]string) -) +var modulePrefix = []byte("\nmodule ") + +var pkgPathFromGoModCache = struct { + paths map[string]string + sync.RWMutex +}{ + paths: make(map[string]string), +} func getModulePath(goModPath string) string { - pkgPath, ok := pkgPathFromGoModCache[goModPath] + pkgPathFromGoModCache.RLock() + pkgPath, ok := pkgPathFromGoModCache.paths[goModPath] + pkgPathFromGoModCache.RUnlock() if ok { return pkgPath } defer func() { - pkgPathFromGoModCache[goModPath] = pkgPath + pkgPathFromGoModCache.Lock() + pkgPathFromGoModCache.paths[goModPath] = pkgPath + pkgPathFromGoModCache.Unlock() }() data, err := ioutil.ReadFile(goModPath)