瀏覽代碼

fix: thread-safe in getWriter of logx (#2319)

Kevin Wan 2 年之前
父節點
當前提交
dfeef5e497
共有 2 個文件被更改,包括 13 次插入12 次删除
  1. 2 12
      core/logx/logs.go
  2. 11 0
      core/logx/writer.go

+ 2 - 12
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

+ 11 - 0
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()