From dcf5d26f1e9b3aceefec1186c4e0b9e321905481 Mon Sep 17 00:00:00 2001 From: Abhishek Parwal Date: Wed, 15 Apr 2020 05:09:45 -0700 Subject: [PATCH] fix data race --- codegen/module.go | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/codegen/module.go b/codegen/module.go index 42ef2f7e4..00e273df3 100644 --- a/codegen/module.go +++ b/codegen/module.go @@ -569,23 +569,25 @@ func (system *ModuleSystem) ResolveModules( ch := make(chan resolveResult) wg.Add(len(system.moduleSearchPaths[className])) + resolvedModulesCopy := copyResolveModule(resolvedModules) + for _, moduleDirectoryGlob := range system.moduleSearchPaths[className] { go system.resolveModule(baseDirectory, moduleDirectoryGlob, className, packageRoot, - targetGenDir, defaultDependencies, ch, &wg, resolvedModules) + targetGenDir, defaultDependencies, ch, &wg, resolvedModulesCopy) } go func() { wg.Wait() close(ch) }() - for ele := range ch { - if ele.err != nil { - return nil, ele.err + for result := range ch { + if result.err != nil { + return nil, result.err } - if ele.module == nil { + if result.module == nil { continue } - mergeResolveMap(ele.module, resolvedModules, className) + mergeResolveMap(result.module, resolvedModules, className) } } @@ -598,6 +600,21 @@ func (system *ModuleSystem) ResolveModules( return classArrayModuleMap, nil } +func copyResolveModule(resolvedModules map[string]map[string]*ModuleInstance) map[string]map[string]*ModuleInstance { + resolvedModulesCopy := map[string]map[string]*ModuleInstance{} + for className, instanceMap := range resolvedModules { + instanceMapCopy := resolvedModulesCopy[className] + if instanceMapCopy == nil { + instanceMapCopy = map[string]*ModuleInstance{} + resolvedModulesCopy[className] = instanceMapCopy + } + for instanceName, instance := range instanceMap { + instanceMapCopy[instanceName] = instance + } + } + return resolvedModulesCopy +} + type resolveResult struct { err error module map[string]map[string]*ModuleInstance