diff --git a/hrp/plugin.go b/hrp/plugin.go index 850d17c4..d12d1777 100644 --- a/hrp/plugin.go +++ b/hrp/plugin.go @@ -29,9 +29,33 @@ const ( const projectInfoFile = "proj.json" // used for ensuring root project -var pluginMap = sync.Map{} // used for reusing plugin instance +var ( + pluginMap sync.Map // used for reusing plugin instance + pluginMutex sync.Mutex +) -func initPlugin(path, venv string, logOn bool) (plugin funplugin.IPlugin, err error) { +func initPlugin(path, venv string, logOn bool) (funplugin.IPlugin, error) { + if plugin, ok := pluginMap.Load(path); ok { + return plugin.(funplugin.IPlugin), nil + } + + pluginMutex.Lock() + defer pluginMutex.Unlock() + + if plugin, ok := pluginMap.Load(path); ok { + return plugin.(funplugin.IPlugin), nil + } + + p, err := initplugin(path, venv, logOn) + if err != nil { + return nil, errors.Wrap(err, "init plugin failed") + } + + pluginMap.Store(path, p) + return p, nil +} + +func initplugin(path, venv string, logOn bool) (plugin funplugin.IPlugin, err error) { // plugin file not found if path == "" { return nil, nil