diff --git a/cache.go b/cache.go index 86e4abb..f140664 100644 --- a/cache.go +++ b/cache.go @@ -3,9 +3,8 @@ package htmlquery import ( "sync" - "github.com/golang/groupcache/lru" - "github.com/antchfx/xpath" + "github.com/golang/groupcache/lru" ) // DisableSelectorCache will disable caching for the query selector if value is true. @@ -16,8 +15,9 @@ var DisableSelectorCache = false var SelectorCacheMaxEntries = 50 var ( - cacheOnce sync.Once - cache *lru.Cache + cacheOnce sync.Once + cache *lru.Cache + cacheMutex sync.RWMutex ) func getQuery(expr string) (*xpath.Expr, error) { @@ -27,9 +27,14 @@ func getQuery(expr string) (*xpath.Expr, error) { cacheOnce.Do(func() { cache = lru.New(50) }) + cacheMutex.RLock() if v, ok := cache.Get(expr); ok { + cacheMutex.RUnlock() return v.(*xpath.Expr), nil } + cacheMutex.RUnlock() + cacheMutex.Lock() + defer cacheMutex.Unlock() v, err := xpath.Compile(expr) if err != nil { return nil, err