From 53116be35488dab36a7ed84045ba4f35978ce7be Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Tue, 18 Apr 2023 21:04:38 +0800 Subject: [PATCH] fix #1549: avoid duplicate creating plugins --- hrp/plugin.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) 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