@@ -25,7 +25,7 @@ public static class PluginManager
25
25
{
26
26
private static readonly string ClassName = nameof ( PluginManager ) ;
27
27
28
- private static List < PluginPair > _allLoadedPlugins ;
28
+ private static readonly ConcurrentDictionary < string , PluginPair > _allLoadedPlugins = [ ] ;
29
29
private static readonly ConcurrentDictionary < string , PluginPair > _allInitializedPlugins = [ ] ;
30
30
private static readonly ConcurrentDictionary < string , PluginPair > _initFailedPlugins = [ ] ;
31
31
private static readonly ConcurrentDictionary < string , PluginPair > _globalPlugins = [ ] ;
@@ -204,7 +204,17 @@ public static void LoadPlugins(PluginsSettings settings)
204
204
Settings . UpdatePluginSettings ( metadatas ) ;
205
205
206
206
// Load plugins
207
- _allLoadedPlugins = PluginsLoader . Plugins ( metadatas , Settings ) ;
207
+ var allLoadedPlugins = PluginsLoader . Plugins ( metadatas , Settings ) ;
208
+ foreach ( var plugin in allLoadedPlugins )
209
+ {
210
+ if ( plugin != null )
211
+ {
212
+ if ( ! _allLoadedPlugins . TryAdd ( plugin . Metadata . ID , plugin ) )
213
+ {
214
+ PublicApi . Instance . LogError ( ClassName , $ "Plugin with ID { plugin . Metadata . ID } already loaded") ;
215
+ }
216
+ }
217
+ }
208
218
209
219
// Since dotnet plugins need to get assembly name first, we should update plugin directory after loading plugins
210
220
UpdatePluginDirectory ( metadatas ) ;
@@ -244,8 +254,10 @@ private static void UpdatePluginDirectory(List<PluginMetadata> metadatas)
244
254
/// <returns>return the list of failed to init plugins or null for none</returns>
245
255
public static async Task InitializePluginsAsync ( IResultUpdateRegister register )
246
256
{
247
- var initTasks = _allLoadedPlugins . Select ( pair => Task . Run ( async ( ) =>
257
+ var initTasks = _allLoadedPlugins . Select ( x => Task . Run ( async ( ) =>
248
258
{
259
+ var pair = x . Value ;
260
+
249
261
// Register plugin action keywords so that plugins can be queried in results
250
262
RegisterPluginActionKeywords ( pair ) ;
251
263
@@ -543,7 +555,7 @@ private static bool IsPluginInitializing(PluginMetadata metadata)
543
555
544
556
public static List < PluginPair > GetAllLoadedPlugins ( )
545
557
{
546
- return [ .. _allLoadedPlugins ] ;
558
+ return [ .. _allLoadedPlugins . Values ] ;
547
559
}
548
560
549
561
public static List < PluginPair > GetAllInitializedPlugins ( bool includeFailed )
@@ -655,7 +667,7 @@ public static bool IsHomePlugin(string id)
655
667
public static bool IsInitializingOrInitFailed ( string id )
656
668
{
657
669
// Id does not exist in loaded plugins
658
- if ( ! _allLoadedPlugins . Any ( x => x . Metadata . ID == id ) ) return false ;
670
+ if ( ! _allLoadedPlugins . Any ( x => x . Value . Metadata . ID == id ) ) return false ;
659
671
660
672
// Plugin initialized already
661
673
if ( _allInitializedPlugins . ContainsKey ( id ) )
@@ -962,7 +974,7 @@ internal static async Task<bool> UninstallPluginAsync(PluginMetadata plugin, boo
962
974
}
963
975
Settings . RemovePluginSettings ( plugin . ID ) ;
964
976
{
965
- _allLoadedPlugins . RemoveAll ( p => p . Metadata . ID == plugin . ID ) ;
977
+ _allLoadedPlugins . TryRemove ( plugin . ID , out var _ ) ;
966
978
}
967
979
{
968
980
_allInitializedPlugins . TryRemove ( plugin . ID , out var _ ) ;
0 commit comments