From 1bd3044d489b5864265951b23a04795245d309f7 Mon Sep 17 00:00:00 2001 From: Kostadin Plachkov Date: Mon, 1 Oct 2018 21:13:28 +0300 Subject: [PATCH 1/4] fix: data race warning (#1180) --- debug.go | 3 ++- mode.go | 16 +++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/debug.go b/debug.go index c5e65b2209..a5b2062666 100644 --- a/debug.go +++ b/debug.go @@ -12,6 +12,7 @@ import ( "runtime" "strconv" "strings" + "sync/atomic" ) const ginSupportMinGoVer = 6 @@ -19,7 +20,7 @@ const ginSupportMinGoVer = 6 // IsDebugging returns true if the framework is running in debug mode. // Use SetMode(gin.ReleaseMode) to disable debug mode. func IsDebugging() bool { - return ginMode == debugCode + return atomic.LoadInt32(&ginMode) == debugCode } // DebugPrintRouteFunc indicates debug log output format. diff --git a/mode.go b/mode.go index 7cb0143a43..af7d8b421f 100644 --- a/mode.go +++ b/mode.go @@ -7,6 +7,7 @@ package gin import ( "io" "os" + "sync/atomic" "github.com/gin-gonic/gin/binding" ) @@ -38,10 +39,11 @@ const ( var DefaultWriter io.Writer = os.Stdout var DefaultErrorWriter io.Writer = os.Stderr -var ginMode = debugCode -var modeName = DebugMode +var ginMode int32 = debugCode +var modeName atomic.Value func init() { + modeName.Store(DebugMode) mode := os.Getenv(ENV_GIN_MODE) SetMode(mode) } @@ -50,18 +52,18 @@ func init() { func SetMode(value string) { switch value { case DebugMode, "": - ginMode = debugCode + atomic.StoreInt32(&ginMode, debugCode) case ReleaseMode: - ginMode = releaseCode + atomic.StoreInt32(&ginMode, releaseCode) case TestMode: - ginMode = testCode + atomic.StoreInt32(&ginMode, testCode) default: panic("gin mode unknown: " + value) } if value == "" { value = DebugMode } - modeName = value + modeName.Store(value) } // DisableBindValidation closes the default validator. @@ -77,5 +79,5 @@ func EnableJsonDecoderUseNumber() { // Mode returns currently gin mode. func Mode() string { - return modeName + return modeName.Load().(string) } From 2b148122c8d086f607fb95896f645c54303f00ac Mon Sep 17 00:00:00 2001 From: Kostadin Plachkov Date: Mon, 1 Oct 2018 21:55:33 +0300 Subject: [PATCH 2/4] Fix the tests --- mode_test.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mode_test.go b/mode_test.go index cf27acd861..0748de0181 100644 --- a/mode_test.go +++ b/mode_test.go @@ -6,6 +6,7 @@ package gin import ( "os" + "sync/atomic" "testing" "github.com/gin-gonic/gin/binding" @@ -17,24 +18,24 @@ func init() { } func TestSetMode(t *testing.T) { - assert.Equal(t, testCode, ginMode) + assert.Equal(t, int32(testCode), atomic.LoadInt32(&ginMode)) assert.Equal(t, TestMode, Mode()) os.Unsetenv(ENV_GIN_MODE) SetMode("") - assert.Equal(t, debugCode, ginMode) + assert.Equal(t, int32(debugCode), atomic.LoadInt32(&ginMode)) assert.Equal(t, DebugMode, Mode()) SetMode(DebugMode) - assert.Equal(t, debugCode, ginMode) + assert.Equal(t, int32(debugCode), atomic.LoadInt32(&ginMode)) assert.Equal(t, DebugMode, Mode()) SetMode(ReleaseMode) - assert.Equal(t, releaseCode, ginMode) + assert.Equal(t, int32(releaseCode), atomic.LoadInt32(&ginMode)) assert.Equal(t, ReleaseMode, Mode()) SetMode(TestMode) - assert.Equal(t, testCode, ginMode) + assert.Equal(t, int32(testCode), atomic.LoadInt32(&ginMode)) assert.Equal(t, TestMode, Mode()) assert.Panics(t, func() { SetMode("unknown") }) From 8b2d9c6f81078ebac5b29e022a5ac373f02cd28b Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Wed, 8 May 2024 09:03:53 +0800 Subject: [PATCH 3/4] refactor: remove unnecessary imports and optimize codebase - Remove unnecessary import of `flag` Signed-off-by: Bo-Yi Wu --- mode_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/mode_test.go b/mode_test.go index bb17a9ef48..f87147fcc3 100644 --- a/mode_test.go +++ b/mode_test.go @@ -5,7 +5,6 @@ package gin import ( - "flag" "os" "sync/atomic" "testing" From 3bd58a8720b895ff63293d73f0300008ef760cf7 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Wed, 8 May 2024 09:06:47 +0800 Subject: [PATCH 4/4] test: refactor test assertions for mode settings - Update test assertions for mode setting in `mode_test.go` Signed-off-by: Bo-Yi Wu --- mode_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mode_test.go b/mode_test.go index f87147fcc3..be03a9d058 100644 --- a/mode_test.go +++ b/mode_test.go @@ -23,8 +23,8 @@ func TestSetMode(t *testing.T) { os.Unsetenv(EnvGinMode) SetMode("") - assert.Equal(t, int32(debugCode), atomic.LoadInt32(&ginMode)) - assert.Equal(t, DebugMode, Mode()) + assert.Equal(t, int32(testCode), atomic.LoadInt32(&ginMode)) + assert.Equal(t, TestMode, Mode()) SetMode(DebugMode) assert.Equal(t, int32(debugCode), atomic.LoadInt32(&ginMode))