Skip to content

Commit e878eb6

Browse files
author
Alireza Poodineh
committed
Optimize plugin loader
1 parent b88aefb commit e878eb6

2 files changed

Lines changed: 35 additions & 24 deletions

File tree

src/PluginXpert/PluginLoadResult.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public enum PluginLoadResult
2525
/// </summary>
2626
NotSupportedRuntime,
2727

28+
/// <summary>
29+
/// Indicates that the plugin is ignored by the plugin manager.
30+
/// </summary>
31+
Skipped,
32+
2833
/// <summary>
2934
/// Indicates that an error occurred while loading the plugin.
3035
/// </summary>

src/PluginXpert/PluginManager.cs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
128128

129129
VerifyPackage(package);
130130

131-
Dictionary<string, Dictionary<string, PluginMetadata>> loadCondidates = [];
131+
Dictionary<string, Dictionary<string, PluginLoadSession>> loadCondidates = [];
132132

133133
foreach (PluginMetadata ent in package.PackageInfo.Plugins)
134134
{
@@ -139,7 +139,7 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
139139
continue;
140140
}
141141

142-
if (!loadCondidates.TryGetValue(ent.Id, out Dictionary<string, PluginMetadata>? value))
142+
if (!loadCondidates.TryGetValue(ent.Id, out Dictionary<string, PluginLoadSession>? value))
143143
{
144144
value = [];
145145
loadCondidates[ent.Id] = value;
@@ -151,26 +151,27 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
151151
continue;
152152
}
153153

154-
value[ent.BuildTag] = ent;
154+
value[ent.BuildTag] = session;
155155
}
156156

157-
List<PluginMetadata> chosenEntries = PickPlugins(loadCondidates);
157+
var chosenEntries = PickPlugins(loadCondidates);
158158

159-
if (chosenEntries.Count == 0) throw new ArgumentException("Can't find any suitable plugins in this package");
160-
161-
List<PluginContext> plugins = [];
162-
foreach (PluginMetadata entry in chosenEntries)
159+
if (!chosenEntries.Any())
163160
{
164-
PluginLoadSession session = LoadSessions.Values.Where(x => x.Metadata == entry).Single();
161+
throw new ArgumentException("Can't find any suitable plugins in this package");
162+
}
165163

164+
List<PluginContext> contexts = new();
165+
foreach (PluginLoadSession session in chosenEntries)
166+
{
166167
_ = session.TryRun(() =>
167168
{
168169
string tempPath = Path.Combine(session.Implementation!.TempPath, session.Package.PackageInfo.Id);
169170
Directory.CreateDirectory(tempPath);
170171

171-
package.ExtractPlugin(entry, tempPath);
172+
package.ExtractPlugin(session.Metadata, tempPath);
172173

173-
session.AssemblyPath = Path.Combine(tempPath, $"{entry.Id}-{entry.BuildTag}", entry.Assembly);
174+
session.AssemblyPath = Path.Combine(tempPath, $"{session.Metadata.Id}-{session.Metadata.BuildTag}", session.Metadata.Assembly);
174175
session.Token = SecurityContext.RegisterPlugin(session);
175176

176177
CasPolicyBuilder policyBuilder = new CasPolicyBuilder();
@@ -185,10 +186,10 @@ public IEnumerable<PluginContext> LoadPlugins(PluginPackage package)
185186
PluginContext context = new PluginContext(session);
186187
session.Implementation!.Add(context);
187188

188-
plugins.Add(context);
189+
contexts.Add(context);
189190
}
190191

191-
return plugins;
192+
return contexts;
192193
}
193194

194195
/// <summary>
@@ -290,26 +291,31 @@ private PluginLoadSession CreateSession(PluginPackage package,
290291
/// <returns>
291292
/// A list of chosen plugin metadata.
292293
/// </returns>
293-
private static List<PluginMetadata> PickPlugins(Dictionary<string, Dictionary<string, PluginMetadata>> loadCondidates)
294+
private static IEnumerable<PluginLoadSession> PickPlugins(Dictionary<string, Dictionary<string, PluginLoadSession>> loadCondidates)
294295
{
295-
List<PluginMetadata> chosenEntries = [];
296-
foreach (Dictionary<string, PluginMetadata> plg in loadCondidates.Values)
296+
foreach (Dictionary<string, PluginLoadSession> plg in loadCondidates.Values)
297297
{
298298
if (plg.Count == 1)
299299
{
300-
chosenEntries.Add(plg.First().Value);
300+
yield return plg.Values.First();
301301
continue;
302302
}
303303

304-
PluginMetadata? chosenEnt = plg.Values
305-
.Where(v => v.TargetFrameworkVersion <= RuntimeVersion) // Only consider versions lower or equal to the runtime version
306-
.OrderByDescending(v => v.TargetFrameworkVersion) // Get the largest version among them
307-
.FirstOrDefault();
304+
var sorted = plg.Values
305+
.Where(v => v.Metadata.TargetFrameworkVersion <= RuntimeVersion) // Only consider versions lower or equal to the runtime version
306+
.OrderByDescending(v => v.Metadata.TargetFrameworkVersion); // Get the largest version among them
308307

309-
if (chosenEnt.HasValue) chosenEntries.Add(chosenEnt.Value);
310-
}
308+
foreach (var entry in sorted.Skip(1))
309+
{
310+
entry.Result = PluginLoadResult.Skipped;
311+
}
311312

312-
return chosenEntries;
313+
var chosen = sorted.FirstOrDefault();
314+
if (chosen != null)
315+
{
316+
yield return chosen;
317+
}
318+
}
313319
}
314320

315321
/// <summary>

0 commit comments

Comments
 (0)