edmt / log4go

Automatically exported from code.google.com/p/log4go

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Fix for a data race found with Go 1.1's new race detector

GoogleCodeExporter opened this issue · comments

$ hg log -p -r 49
changeset:   49:c177575d6b20
tag:         tip
user:        Fredrik Ehnbom <fredrik@ehnbom.nu>
date:        Wed Apr 17 10:45:22 2013 +0200
summary:     Fix for a data race found with Go 1.1's new race detector 
http://tip.golang.org/doc/articles/race_detector.html

diff -r c3294304d93f -r c177575d6b20 pattlog.go
--- a/pattlog.go    Sat Feb 25 12:58:10 2012 -0800
+++ b/pattlog.go    Wed Apr 17 10:45:22 2013 +0200
@@ -3,9 +3,10 @@
 package log4go

 import (
+   "bytes"
    "fmt"
-   "bytes"
    "io"
+   "sync"
 )

 const (
@@ -21,6 +22,7 @@
 }

 var formatCache = &formatCacheType{}
+var formatMutex sync.Mutex

 // Known format codes:
 // %T - Time (15:04:05 MST)
@@ -43,7 +45,9 @@
    out := bytes.NewBuffer(make([]byte, 0, 64))
    secs := rec.Created.UnixNano() / 1e9

+   formatMutex.Lock()
    cache := *formatCache
+   formatMutex.Unlock()
    if cache.LastUpdateSeconds != secs {
        month, day, year := rec.Created.Month(), rec.Created.Day(), rec.Created.Year()
        hour, minute, second := rec.Created.Hour(), rec.Created.Minute(), rec.Created.Second()
@@ -55,8 +59,10 @@
            longTime:          fmt.Sprintf("%02d:%02d:%02d %s", hour, minute, second, zone),
            longDate:          fmt.Sprintf("%04d/%02d/%02d", year, month, day),
        }
+       formatMutex.Lock()
        cache = *updated
        formatCache = updated
+       formatMutex.Unlock()
    }

    // Split the string into pieces by % signs

Original issue reported on code.google.com by quarns...@gmail.com on 17 Apr 2013 at 8:47