From 0c2fa662f60cf8b6b771fef3ff4c740eae17a83d Mon Sep 17 00:00:00 2001 From: vman Date: Wed, 28 Dec 2022 14:15:04 -0500 Subject: Global cache client, asm loading, plugin local cache, and event managment --- .../Events/EventManagment.cs | 56 ++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) (limited to 'VNLib.Plugins.Extensions.Loading/Events/EventManagment.cs') diff --git a/VNLib.Plugins.Extensions.Loading/Events/EventManagment.cs b/VNLib.Plugins.Extensions.Loading/Events/EventManagment.cs index 356cb8b..af55852 100644 --- a/VNLib.Plugins.Extensions.Loading/Events/EventManagment.cs +++ b/VNLib.Plugins.Extensions.Loading/Events/EventManagment.cs @@ -50,17 +50,65 @@ namespace VNLib.Plugins.Extensions.Loading.Events /// /// An asyncrhonous callback method. /// The event interval + /// A value that indicates if the callback should be run as soon as possible /// An that can manage the interval state /// /// If exceptions are raised during callback execution, they are written to the plugin's default log provider - public static EventHandle ScheduleInterval(this PluginBase plugin, AsyncSchedulableCallback asyncCallback, TimeSpan interval) + public static void ScheduleInterval(this PluginBase plugin, AsyncSchedulableCallback asyncCallback, TimeSpan interval, bool immediate = false) { plugin.ThrowIfUnloaded(); plugin.Log.Verbose("Interval for {t} scheduled", interval); - //Load new event handler - return new(asyncCallback, interval, plugin); + + //Run interval on plugins bg scheduler + _ = plugin.DeferTask(() => RunIntervalOnPluginScheduler(plugin, asyncCallback, interval, immediate)); } + + private static async Task RunIntervalOnPluginScheduler(PluginBase plugin, AsyncSchedulableCallback callback, TimeSpan interval, bool immediate) + { + + static async Task RunCallbackAsync(PluginBase plugin, AsyncSchedulableCallback callback) + { + try + { + //invoke interval callback + await callback(plugin.Log, plugin.UnloadToken).ConfigureAwait(false); + } + catch (OperationCanceledException) + { + //unloaded + plugin.Log.Verbose("Interval callback canceled due to plugin unload or other event cancellation"); + } + catch (Exception ex) + { + plugin.Log.Error(ex, "Unhandled exception raised during timer callback"); + } + } + + //Run callback immediatly if requested + if (immediate) + { + await RunCallbackAsync(plugin, callback); + } + + //Timer loop + while (true) + { + try + { + //await delay and wait for plugin cancellation + await Task.Delay(interval, plugin.UnloadToken); + } + catch (TaskCanceledException) + { + //Unload token canceled, exit loop + break; + } + + await RunCallbackAsync(plugin, callback); + } + } + /// /// Registers an type's event handler for /// raising timed interval events @@ -71,7 +119,7 @@ namespace VNLib.Plugins.Extensions.Loading.Events /// An that can manage the interval state /// /// If exceptions are raised during callback execution, they are written to the plugin's default log provider - public static EventHandle ScheduleInterval(this PluginBase plugin, IIntervalScheduleable scheduleable, TimeSpan interval) => + public static void ScheduleInterval(this PluginBase plugin, IIntervalScheduleable scheduleable, TimeSpan interval) => ScheduleInterval(plugin, scheduleable.OnIntervalAsync, interval); } } -- cgit