shithub: hugo

Download patch

ref: c5f40e8b8ba1d8eaac11bbbf3b537e3e4e94c860
parent: 58c446f56282cb8c24f5dce0ef03e5e7bebe00ef
author: Bjørn Erik Pedersen <[email protected]>
date: Sat Nov 21 16:57:26 EST 2015

Improve RW-locking of template in shortcode handling

See #1599

--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -345,12 +345,12 @@
 			}
 
 			// TODO(bep) Refactor/rename this lock strategy
-			isInnerShortcodeCache.Lock()
+			isInnerShortcodeCache.RLock()
 			if tmpl.Tree == nil {
-				isInnerShortcodeCache.Unlock()
+				isInnerShortcodeCache.RUnlock()
 				return sc, fmt.Errorf("Template for shortcode '%s' failed to compile for page '%s'", sc.name, p.BaseFileName())
 			}
-			isInnerShortcodeCache.Unlock()
+			isInnerShortcodeCache.RUnlock()
 			isInner = isInnerShortcode(tmpl)
 
 		case tScParam:
@@ -523,6 +523,9 @@
 	buffer := bp.GetBuffer()
 	defer bp.PutBuffer(buffer)
 
+	// TODO(bep) Refactor/rename this lock strategy
+	isInnerShortcodeCache.Lock()
+	defer isInnerShortcodeCache.Unlock()
 	err := tmpl.Execute(buffer, data)
 	if err != nil {
 		jww.ERROR.Println("error processing shortcode", tmpl.Name(), "\n ERR:", err)