From d2d812213b99ee17f9433f81871b694c4053ff23 Mon Sep 17 00:00:00 2001 From: vnugent Date: Thu, 2 Nov 2023 01:50:05 -0400 Subject: also carried away --- .../src/RemoteCacheOperator.cs | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 plugins/VNLib.Data.Caching.Providers.VNCache/src/RemoteCacheOperator.cs (limited to 'plugins/VNLib.Data.Caching.Providers.VNCache/src/RemoteCacheOperator.cs') diff --git a/plugins/VNLib.Data.Caching.Providers.VNCache/src/RemoteCacheOperator.cs b/plugins/VNLib.Data.Caching.Providers.VNCache/src/RemoteCacheOperator.cs new file mode 100644 index 0000000..fdf1c5e --- /dev/null +++ b/plugins/VNLib.Data.Caching.Providers.VNCache/src/RemoteCacheOperator.cs @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2023 Vaughn Nugent +* +* Library: VNLib +* Package: VNLib.Data.Caching.Providers.VNCache +* File: RemoteCacheOperator.cs +* +* RemoteCacheOperator.cs is part of VNLib.Data.Caching.Providers.VNCache which is +* part of the larger VNLib collection of libraries and utilities. +* +* VNLib.Data.Caching.Providers.VNCache is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* VNLib.Data.Caching.Providers.VNCache is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ + +using System; +using System.Threading; +using System.Threading.Tasks; + +using VNLib.Utils.Logging; +using VNLib.Plugins; +using VNLib.Plugins.Extensions.Loading; + +namespace VNLib.Data.Caching.Providers.VNCache +{ + /// + /// Represents a handle to a VNCache cache client, that exposes a cancellable + /// to run inside a + /// or standlone in your own background work handler + /// + /// + /// The background work method must be sheduled for the cache client to be + /// connected to the backing store + /// + public sealed class RemoteCacheOperator : IAsyncBackgroundWork + { + private readonly FBMCacheClient _client; + private CancellationTokenSource? _tokenSource; + + internal RemoteCacheOperator(FBMCacheClient client, RemoteBackedMemoryCache? memCache) + { + //Store the client to be used in the background work + _client = client; + Cache = memCache ?? (IGlobalCacheProvider)client; //Cache is the remote backing store + } + + /// + /// The configured global cache instance + /// + public IGlobalCacheProvider Cache { get; } + + /// + /// + public async Task DoWorkAsync(ILogProvider pluginLog, CancellationToken exitToken) + { + _ = pluginLog ?? throw new ArgumentNullException(nameof(pluginLog)); + + //Create cts linked to the exit token to allow user cancellation of the listener + using (_tokenSource = CancellationTokenSource.CreateLinkedTokenSource(exitToken)) + { + //Do work with linked source + await _client.DoWorkAsync(pluginLog, _tokenSource.Token) + .ConfigureAwait(false); + } + + //Remove cts + _tokenSource = null; + } + + /// + /// Cancels the background cache client listener + /// + public void CancelListener() => _tokenSource?.Cancel(); + + } +} \ No newline at end of file -- cgit