From 878754c21f7b91310bd80b48a7e676b3b1071504 Mon Sep 17 00:00:00 2001 From: bep Date: Wed, 21 Jan 2015 19:13:11 +0100 Subject: [PATCH] Protect the innerShortCodeCache by a RW lock --- hugolib/shortcode.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index 8743cc321..ff3eaeb89 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -22,6 +22,7 @@ import ( "sort" "strconv" "strings" + "sync" "github.com/spf13/hugo/helpers" "github.com/spf13/hugo/tpl" @@ -143,18 +144,28 @@ func ShortcodesHandle(stringToParse string, page *Page, t tpl.Template) string { return string(tmpContent) } -var isInnerShortcodeCache = make(map[string]bool) +var isInnerShortcodeCache = struct { + sync.RWMutex + m map[string]bool +}{m: make(map[string]bool)} // to avoid potential costly look-aheads for closing tags we look inside the template itself // we could change the syntax to self-closing tags, but that would make users cry // the value found is cached func isInnerShortcode(t *template.Template) bool { - if m, ok := isInnerShortcodeCache[t.Name()]; ok { + isInnerShortcodeCache.RLock() + m, ok := isInnerShortcodeCache.m[t.Name()] + isInnerShortcodeCache.RUnlock() + + if ok { return m } match, _ := regexp.MatchString("{{.*?\\.Inner.*?}}", t.Tree.Root.String()) - isInnerShortcodeCache[t.Name()] = match + + isInnerShortcodeCache.Lock() + isInnerShortcodeCache.m[t.Name()] = match + isInnerShortcodeCache.Unlock() return match }