From 22f5e15ee9a34622c7625d7d2feba201ceafb50c Mon Sep 17 00:00:00 2001 From: David Sharnoff Date: Sat, 1 Apr 2023 16:13:27 -0700 Subject: [PATCH] fix: race with parallel calls to Inner (#64) * fix race * fix? data race seen in test with debug output --- generate.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/generate.go b/generate.go index 201800e..1f7de28 100644 --- a/generate.go +++ b/generate.go @@ -78,8 +78,8 @@ func generateInputMapper(fm *provider, start int, param flowType, rmap map[typeC return func(v valueCollection) []reflect.Value { if debugEnabled() { debugf("%s: %s [%s] numIn:%d, m:%v", fm, param, formatFlow(fm.flows[param]), pMap.len, pMap.vcIndex) + dumpValueArray(v, "", vmap) } - dumpValueArray(v, "", vmap) in := make([]reflect.Value, pMap.len) for i := start; i < pMap.len; i++ { if pMap.vcIndex[i] != -1 { @@ -207,26 +207,26 @@ func generateWrappers( // for thread safety, this is not built outside WrapWrapper inner := func(i []reflect.Value) []reflect.Value { + common := func(v valueCollection) []reflect.Value { + outMap(v, i) + next(v) + r := retMap(v) + for i, retV := range r { + if rTypes[i].Kind() == reflect.Interface { + r[i] = retV.Convert(rTypes[i]) + } + } + return r + } if !fm.parallel { callCount++ if callCount > 1 { v = vCopy.Copy() } - outMap(v, i) - next(v) - } else { - atomic.AddInt32(&callCount, 1) - vc := vCopy.Copy() - outMap(vc, i) - next(vc) - } - r := retMap(v) - for i, retV := range r { - if rTypes[i].Kind() == reflect.Interface { - r[i] = retV.Convert(rTypes[i]) - } + return common(v) } - return r + atomic.AddInt32(&callCount, 1) + return common(vCopy.Copy()) } in := inMap(v) if reflective {