shithub: hugo

Download patch

ref: 878754c21f7b91310bd80b48a7e676b3b1071504
parent: c8f8f48e9600f733422180d50a97bb2deea8ba75
author: bep <[email protected]>
date: Wed Jan 21 14:13:11 EST 2015

Protect the innerShortCodeCache by a RW lock

--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -22,6 +22,7 @@
 	"sort"
 	"strconv"
 	"strings"
+	"sync"
 
 	"github.com/spf13/hugo/helpers"
 	"github.com/spf13/hugo/tpl"
@@ -143,18 +144,28 @@
 	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
 }