From ff31de73a58b8336686ebc1f49592ccac181a091 Mon Sep 17 00:00:00 2001 From: "liuguoyang@cmcm.com" Date: Fri, 6 Sep 2019 16:24:51 +0800 Subject: [PATCH] context add RWMutex for key set and get Goroutine safe --- context.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/context.go b/context.go index d9fcc285..27c6e5a7 100644 --- a/context.go +++ b/context.go @@ -16,6 +16,7 @@ import ( "net/url" "os" "strings" + "sync" "time" "github.com/gin-contrib/sse" @@ -55,6 +56,9 @@ type Context struct { // Keys is a key/value pair exclusively for the context of each request. Keys map[string]interface{} + // RWMutex for Keys Set and Get Goroutine safe + m sync.RWMutex + // Errors is a list of errors attached to all the handlers/middlewares who used this context. Errors errorMsgs @@ -219,6 +223,8 @@ func (c *Context) Error(err error) *Error { // Set is used to store a new key/value pair exclusively for this context. // It also lazy initializes c.Keys if it was not used previously. func (c *Context) Set(key string, value interface{}) { + c.m.Lock() + defer c.m.Unlock() if c.Keys == nil { c.Keys = make(map[string]interface{}) } @@ -228,6 +234,8 @@ func (c *Context) Set(key string, value interface{}) { // Get returns the value for the given key, ie: (value, true). // If the value does not exists it returns (nil, false) func (c *Context) Get(key string) (value interface{}, exists bool) { + c.m.RLock() + defer c.m.RUnlock() value, exists = c.Keys[key] return }