Improve RW-locking of template in shortcode handling
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 21 Nov 2015 20:57:26 +0000 (21:57 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 21 Nov 2015 20:57:26 +0000 (21:57 +0100)
See #1599

hugolib/shortcode.go

index c49418b8562d72078d5e970b42137d965737b179..4d3037dc8b277abfa4f1e7d0ae49be62e19f9c61 100644 (file)
@@ -345,12 +345,12 @@ Loop:
                        }
 
                        // 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 @@ func renderShortcodeWithPage(tmpl *template.Template, data *ShortcodeWithPage) s
        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)