Protect the innerShortCodeCache by a RW lock

This commit is contained in:
bep 2015-01-21 19:13:11 +01:00
parent c8f8f48e96
commit 878754c21f

View file

@ -22,6 +22,7 @@ import (
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
"sync"
"github.com/spf13/hugo/helpers" "github.com/spf13/hugo/helpers"
"github.com/spf13/hugo/tpl" "github.com/spf13/hugo/tpl"
@ -143,18 +144,28 @@ func ShortcodesHandle(stringToParse string, page *Page, t tpl.Template) string {
return string(tmpContent) 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 // 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 // we could change the syntax to self-closing tags, but that would make users cry
// the value found is cached // the value found is cached
func isInnerShortcode(t *template.Template) bool { 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 return m
} }
match, _ := regexp.MatchString("{{.*?\\.Inner.*?}}", t.Tree.Root.String()) match, _ := regexp.MatchString("{{.*?\\.Inner.*?}}", t.Tree.Root.String())
isInnerShortcodeCache[t.Name()] = match
isInnerShortcodeCache.Lock()
isInnerShortcodeCache.m[t.Name()] = match
isInnerShortcodeCache.Unlock()
return match return match
} }