From eab5cc38b51df9b5a240f5c23bc7941b3d0852d2 Mon Sep 17 00:00:00 2001 From: Minoru TAKASE Date: Wed, 10 Apr 2024 10:50:54 +0900 Subject: [PATCH] Fix data race in loadAlignmentPatternLoc (#104) * Fix data race in loadAlignmentPatternLoc * Add test for loadAlignmentPatternLoc with concurrent access * go test with -race flag --- .github/workflows/go.yml | 8 ++++---- version.go | 8 +++++++- version_test.go | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index d61c61a..7f808d2 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -34,21 +34,21 @@ jobs: stable: false - name: Build - run: go build -v ./... + run: go build -v -race ./... - name: Test qrcode working-directory: . - run: go test -v ./... + run: go test -v -race ./... continue-on-error: false - name: Test writer/standard working-directory: ./writer/standard - run: go mod tidy && mkdir testdata && go test -v ./... + run: go mod tidy && mkdir testdata && go test -v -race ./... continue-on-error: false - name: Test writer/terminal working-directory: ./writer/terminal - run: go mod tidy && mkdir testdata && go test -v ./... + run: go mod tidy && mkdir testdata && go test -v -race ./... continue-on-error: false - name: Upload coverage reports to Codecov diff --git a/version.go b/version.go index e241b46..36afb76 100644 --- a/version.go +++ b/version.go @@ -4,6 +4,7 @@ import ( "errors" "log" "strconv" + "sync" // "github.com/skip2/go-qrcode/bitset" "github.com/yeqown/reedsolomon/binary" @@ -353,7 +354,8 @@ var ( 40: {6, 30, 58, 86, 114, 142, 170}, } - alignPatternCache = map[int][]loc{} + alignPatternCache = map[int][]loc{} + alignPatternCacheMu sync.Mutex ) // loc point position(x,y) @@ -367,6 +369,10 @@ func loadAlignmentPatternLoc(ver int) (locs []loc) { if ver < 2 { return } + + alignPatternCacheMu.Lock() + defer alignPatternCacheMu.Unlock() + var ok bool if locs, ok = alignPatternCache[ver]; ok { return diff --git a/version_test.go b/version_test.go index 4911a6e..67d1677 100644 --- a/version_test.go +++ b/version_test.go @@ -4,6 +4,7 @@ import ( "math/rand" "reflect" "strings" + "sync" "testing" "github.com/stretchr/testify/require" @@ -231,6 +232,22 @@ func Test_binarySearchVersion_all(t *testing.T) { } } +func Test_loadAlignmentPatternLoc_concurrentAccess(t *testing.T) { + var wg sync.WaitGroup + + for ver := 2; ver <= _VERSION_COUNT; ver++ { + wg.Add(1) + + go func(v int) { + got := loadAlignmentPatternLoc(v) + assert.NotEmpty(t, got) + wg.Done() + }(ver) + } + + wg.Wait() +} + // // go test -run=NONE -bench . -count 10 > new/old.txt func Benchmark_loadVersion_top(b *testing.B) { for i := 0; i < b.N; i++ {