Add a RWMutex to errorTemplates to make formatErrorDescription thread-safe.
diff --git a/errors.go b/errors.go
index f22fa65..f69f22d 100644
--- a/errors.go
+++ b/errors.go
@@ -2,10 +2,18 @@
import (
"bytes"
+ "sync"
"text/template"
)
-var errorTemplates *template.Template
+var errorTemplates errorTemplate = errorTemplate{template.New("errors-new"),sync.RWMutex{}}
+
+// template.Template is not thread-safe for writing, so some locking is done
+// sync.RWMutex is used for efficiently locking when new templates are created
+type errorTemplate struct {
+ *template.Template
+ sync.RWMutex
+}
type (
// RequiredError. ErrorDetails: property string
@@ -241,14 +249,17 @@
var descrAsBuffer bytes.Buffer
var err error
- if errorTemplates == nil {
- errorTemplates = template.New("all-errors")
- }
-
+ errorTemplates.RLock()
tpl = errorTemplates.Lookup(s)
+ errorTemplates.RUnlock()
+
if tpl == nil {
+ errorTemplates.Lock()
tpl = errorTemplates.New(s)
+
tpl, err = tpl.Parse(s)
+ errorTemplates.Unlock()
+
if err != nil {
return err.Error()
}