From 69c351ace2fa907440238309e9ce4298cf547ff9 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 31 Oct 2019 14:45:35 +0800 Subject: [PATCH] add sync.RWMutex for goroutine safe --- viper.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/viper.go b/viper.go index 5133de7..d56a43b 100644 --- a/viper.go +++ b/viper.go @@ -59,7 +59,7 @@ func (e ConfigMarshalError) Error() string { } var v *Viper - +var mutex sync.RWMutex type RemoteResponse struct { Value []byte Error error @@ -499,7 +499,9 @@ func (v *Viper) searchMap(source map[string]interface{}, path []string) interfac return source } + mutex.RLock() next, ok := source[path[0]] + mutex.RUnlock() if ok { // Fast path if len(path) == 1 { @@ -542,7 +544,9 @@ func (v *Viper) searchMapWithPathPrefixes(source map[string]interface{}, path [] for i := len(path); i > 0; i-- { prefixKey := strings.ToLower(strings.Join(path[0:i], v.keyDelim)) + mutex.RLock() next, ok := source[prefixKey] + mutex.RUnlock() if ok { // Fast path if i == len(path) { @@ -1233,7 +1237,9 @@ func (v *Viper) Set(key string, value interface{}) { deepestMap := deepSearch(v.override, path[0:len(path)-1]) // set innermost value + mutex.Lock() deepestMap[lastKey] = value + mutex.Unlock() } // ReadInConfig will discover and load the configuration file from disk @@ -1442,7 +1448,9 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { lastKey := strings.ToLower(path[len(path)-1]) deepestMap := deepSearch(c, path[0:len(path)-1]) // set innermost value + mutex.Lock() deepestMap[lastKey] = value + mutex.Unlock() } } @@ -1805,7 +1813,9 @@ func (v *Viper) AllSettings() map[string]interface{} { lastKey := strings.ToLower(path[len(path)-1]) deepestMap := deepSearch(m, path[0:len(path)-1]) // set innermost value + mutex.Lock() deepestMap[lastKey] = value + mutex.Unlock() } return m }