Ver código fonte

fix concurrent map access with RWMutex

joeybloggs 9 anos atrás
pai
commit
109441133c
2 arquivos alterados com 20 adições e 1 exclusões
  1. 1 1
      README.md
  2. 19 0
      number.go

+ 1 - 1
README.md

@@ -1,6 +1,6 @@
 ## universal-translator
 <img align="right" src="https://raw.githubusercontent.com/go-playground/universal-translator/master/logo.png">
-![Project status](https://img.shields.io/badge/version-0.8.0-green.svg)
+![Project status](https://img.shields.io/badge/version-0.8.1-green.svg)
 [![Build Status](https://semaphoreci.com/api/v1/joeybloggs/universal-translator/branches/master/badge.svg)](https://semaphoreci.com/joeybloggs/universal-translator)
 [![Coverage Status](https://coveralls.io/repos/github/go-playground/universal-translator/badge.svg?branch=master)](https://coveralls.io/github/go-playground/universal-translator?branch=master)
 [![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/universal-translator)](https://goreportcard.com/report/github.com/go-playground/universal-translator)

+ 19 - 0
number.go

@@ -8,6 +8,7 @@ import (
 	"regexp"
 	"strconv"
 	"strings"
+	"sync"
 )
 
 // numberFormat is a struct that contains all the information about number
@@ -44,6 +45,9 @@ var (
 	numberFormats           = map[string]*numberFormat{}
 	numberFormatsNoDecimals = map[string]*numberFormat{}
 
+	nfMutex   = new(sync.RWMutex)
+	nfndMutex = new(sync.RWMutex)
+
 	// prefixSuffixRegex is a regular expression that is used to parse number
 	// formats
 	prefixSuffixRegex = regexp.MustCompile(`(.*?)[#,\.0]+(.*)`)
@@ -152,14 +156,25 @@ func (n Number) parseFormat(pattern string, includeDecimalDigits bool) *numberFo
 
 	if includeDecimalDigits {
 
+		nfMutex.RLock()
+
 		if format, exists := numberFormats[pattern]; exists {
+			nfMutex.RUnlock()
 			return format
 		}
 
+		nfMutex.RUnlock()
+
 	} else {
+
+		nfndMutex.RLock()
+
 		if format, exists := numberFormatsNoDecimals[pattern]; exists {
+			nfndMutex.RUnlock()
 			return format
 		}
+
+		nfndMutex.RUnlock()
 	}
 
 	format := new(numberFormat)
@@ -240,13 +255,17 @@ func (n Number) parseFormat(pattern string, includeDecimalDigits bool) *numberFo
 	}
 
 	if includeDecimalDigits {
+		nfMutex.Lock()
 		numberFormats[pattern] = format
+		nfMutex.Unlock()
 		return format
 	}
 
 	format.maxDecimalDigits = 0
 	format.minDecimalDigits = 0
+	nfndMutex.Lock()
 	numberFormatsNoDecimals[pattern] = format
+	nfndMutex.Unlock()
 	return format
 }