aboutsummaryrefslogtreecommitdiff
path: root/lib/Plugins.Essentials.ServiceStack
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2023-12-30 21:15:51 -0500
committerLibravatar vnugent <public@vaughnnugent.com>2023-12-30 21:15:51 -0500
commit484c7bc63baab39904a1a715d199f879fd7a067a (patch)
tree949383bee253c5094536468be298c1ab1c03f7bf /lib/Plugins.Essentials.ServiceStack
parenta241620dd73f97496855284cf1fb1503debd28ab (diff)
tcp lib refactor, hardware accelerated memcopy, service stack features
Diffstat (limited to 'lib/Plugins.Essentials.ServiceStack')
-rw-r--r--lib/Plugins.Essentials.ServiceStack/src/Construction/HttpServiceStackBuilder.cs16
-rw-r--r--lib/Plugins.Essentials.ServiceStack/src/PluginStackInitializer.cs21
2 files changed, 31 insertions, 6 deletions
diff --git a/lib/Plugins.Essentials.ServiceStack/src/Construction/HttpServiceStackBuilder.cs b/lib/Plugins.Essentials.ServiceStack/src/Construction/HttpServiceStackBuilder.cs
index 91184bd..f100c1d 100644
--- a/lib/Plugins.Essentials.ServiceStack/src/Construction/HttpServiceStackBuilder.cs
+++ b/lib/Plugins.Essentials.ServiceStack/src/Construction/HttpServiceStackBuilder.cs
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2023 Vaughn Nugent
+* Copyright (c) 2024 Vaughn Nugent
*
* Library: VNLib
* Package: VNLib.Plugins.Essentials.ServiceStack
@@ -51,6 +51,7 @@ namespace VNLib.Plugins.Essentials.ServiceStack.Construction
private Func<ServiceGroup, IHttpServer>? _getServers;
private Func<IPluginStack>? _getPlugins;
private IManualPlugin[]? manualPlugins;
+ private bool loadConcurrently;
/// <summary>
/// Uses the supplied callback to get a collection of virtual hosts
@@ -121,6 +122,17 @@ namespace VNLib.Plugins.Essentials.ServiceStack.Construction
}
/// <summary>
+ /// Sets the load concurrency flag for the plugin stack
+ /// </summary>
+ /// <param name="value">True to enable concurrent loading, false for serial loading</param>
+ /// <returns>The current instance for chaining</returns>
+ public HttpServiceStackBuilder LoadPluginsConcurrently(bool value)
+ {
+ loadConcurrently = value;
+ return this;
+ }
+
+ /// <summary>
/// Builds the new <see cref="HttpServiceStack"/> from the configured callbacks
/// </summary>
/// <returns>The newly constructed <see cref="HttpServiceStack"/> that may be used to manage your http services</returns>
@@ -165,7 +177,7 @@ namespace VNLib.Plugins.Essentials.ServiceStack.Construction
plugins ??= new EmptyPluginStack();
#pragma warning restore CA2000 // Dispose objects before losing scope
- return new (domain.GetListener(), plugins, manualPlugins);
+ return new (domain.GetListener(), plugins, manualPlugins, loadConcurrently);
}
/*
diff --git a/lib/Plugins.Essentials.ServiceStack/src/PluginStackInitializer.cs b/lib/Plugins.Essentials.ServiceStack/src/PluginStackInitializer.cs
index 8a4e801..c2ff1e4 100644
--- a/lib/Plugins.Essentials.ServiceStack/src/PluginStackInitializer.cs
+++ b/lib/Plugins.Essentials.ServiceStack/src/PluginStackInitializer.cs
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2023 Vaughn Nugent
+* Copyright (c) 2024 Vaughn Nugent
*
* Library: VNLib
* Package: VNLib.Plugins.Essentials.ServiceStack
@@ -40,7 +40,8 @@ using VNLib.Plugins.Attributes;
namespace VNLib.Plugins.Essentials.ServiceStack
{
- internal sealed record class PluginStackInitializer(PluginLoadEventListener Listener, IPluginStack Stack, IManualPlugin[] ManualPlugins) : IPluginInitializer
+ internal sealed record class PluginStackInitializer(PluginLoadEventListener Listener, IPluginStack Stack, IManualPlugin[] ManualPlugins, bool ConcurrentLoad)
+ : IPluginInitializer
{
private readonly LinkedList<IManagedPlugin> _managedPlugins = new();
private readonly LinkedList<ManualPluginWrapper> _manualPlugins = new();
@@ -88,8 +89,20 @@ namespace VNLib.Plugins.Essentials.ServiceStack
}
}
- //Load stage, load only initialized plugins
- Parallel.ForEach(_loadedPlugins, wp => LoadPlugin(wp, debugLog));
+ /*
+ * Load stage, load only initialized plugins.
+ *
+ * Optionally single-threaded or parallel
+ */
+
+ if (ConcurrentLoad)
+ {
+ Parallel.ForEach(_loadedPlugins, wp => LoadPlugin(wp, debugLog));
+ }
+ else
+ {
+ _loadedPlugins.TryForeach(_loadedPlugins => LoadPlugin(_loadedPlugins, debugLog));
+ }
return _loadedPlugins.ToArray();
}