From dfeef5e497b8e46aec9b7e7040f1c91111eea339 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Mon, 29 Aug 2022 08:32:17 +0800 Subject: [PATCH] fix: thread-safe in getWriter of logx (#2319) --- core/logx/logs.go | 14 ++------------ core/logx/writer.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core/logx/logs.go b/core/logx/logs.go index 9af80757e..325c9370d 100644 --- a/core/logx/logs.go +++ b/core/logx/logs.go @@ -358,19 +358,9 @@ func errorTextSync(msg string) { } func getWriter() Writer { - var w Writer - - writer.lock.RLock() - w = writer.writer - writer.lock.RUnlock() - + w := writer.Load() if w == nil { - writer.lock.Lock() - if writer.writer == nil { - writer.writer = newConsoleWriter() - } - w = writer.writer - writer.lock.Unlock() + w = writer.StoreIfNil(newConsoleWriter()) } return w diff --git a/core/logx/writer.go b/core/logx/writer.go index cb0c121f5..08873c092 100644 --- a/core/logx/writer.go +++ b/core/logx/writer.go @@ -67,6 +67,17 @@ func (w *atomicWriter) Store(v Writer) { w.writer = v } +func (w *atomicWriter) StoreIfNil(v Writer) Writer { + w.lock.Lock() + defer w.lock.Unlock() + + if w.writer == nil { + w.writer = v + } + + return w.writer +} + func (w *atomicWriter) Swap(v Writer) Writer { w.lock.Lock() defer w.lock.Unlock()