From d5a42fc8ac93cebe42cde9c9b91a138358e4f99a Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Sun, 3 May 2020 12:24:14 +0800 Subject: [PATCH] chore(performance): remove Mutex lock in context key See the report: https://github.com/gin-gonic/gin/issues/2350 --- context.go | 17 ----------------- gin.go | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/context.go b/context.go index a2384c0eff..880ccdac56 100644 --- a/context.go +++ b/context.go @@ -16,7 +16,6 @@ import ( "net/url" "os" "strings" - "sync" "time" "github.com/gin-contrib/sse" @@ -53,9 +52,6 @@ type Context struct { engine *Engine - // This mutex protect Keys map - KeysMutex *sync.RWMutex - // Keys is a key/value pair exclusively for the context of each request. Keys map[string]interface{} @@ -86,7 +82,6 @@ func (c *Context) reset() { c.Params = c.Params[0:0] c.handlers = nil c.index = -1 - c.KeysMutex = &sync.RWMutex{} c.fullPath = "" c.Keys = nil c.Errors = c.Errors[0:0] @@ -228,29 +223,17 @@ 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{}) { - if c.KeysMutex == nil { - c.KeysMutex = &sync.RWMutex{} - } - - c.KeysMutex.Lock() if c.Keys == nil { c.Keys = make(map[string]interface{}) } c.Keys[key] = value - c.KeysMutex.Unlock() } // 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) { - if c.KeysMutex == nil { - c.KeysMutex = &sync.RWMutex{} - } - - c.KeysMutex.RLock() value, exists = c.Keys[key] - c.KeysMutex.RUnlock() return } diff --git a/gin.go b/gin.go index 1c2acbc8f4..ab1d0a4684 100644 --- a/gin.go +++ b/gin.go @@ -162,7 +162,7 @@ func Default() *Engine { } func (engine *Engine) allocateContext() *Context { - return &Context{engine: engine, KeysMutex: &sync.RWMutex{}} + return &Context{engine: engine} } // Delims sets template left and right delims and returns a Engine instance.