From 1b0610c514a7a2cc7424d60c4a01f5501b2a8c8f Mon Sep 17 00:00:00 2001 From: Simon G Date: Fri, 13 Nov 2020 13:52:34 +0100 Subject: [PATCH] - requestDataHandler now returns IPoolItem so that InUse can be set to false again --- GBase/DataHandling/Pool/DataHandlerPool.cs | 25 +++++++------------ GBase/GBaseTable.cs | 20 +++++++-------- .../DataHandling/Pool/IDataHandlerPool.cs | 2 +- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/GBase/DataHandling/Pool/DataHandlerPool.cs b/GBase/DataHandling/Pool/DataHandlerPool.cs index 8438d04..c8cb81c 100644 --- a/GBase/DataHandling/Pool/DataHandlerPool.cs +++ b/GBase/DataHandling/Pool/DataHandlerPool.cs @@ -37,7 +37,7 @@ namespace GBase.DataHandling.Pool _waitingRequesters = new List(); } - public async Task RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken) + public async Task> RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken) { if (_pool.All(i => i.InUse) && _pool.Count == _availableDataHandlers) //no free dataHandlers available return await WaitForDataHandler(requester, cancellationToken); @@ -47,17 +47,17 @@ namespace GBase.DataHandling.Pool return GetDataHandler(); } - private async Task WaitForDataHandler(object requester, CancellationToken cancellationToken) + private async Task> WaitForDataHandler(object requester, CancellationToken cancellationToken) { - IDataHandler dataHandler = null; + IPoolItem dataHandlerItem = null; IPoolRequest request = _poolRequestFactory.Create(requester); - while (dataHandler == null) + while (dataHandlerItem == null) { if (_waitingRequesters.Contains(request) && _waitingRequesters.IndexOf(request) == 0) //request is in list and is first { if (_pool.Any(i => !i.InUse)) - dataHandler = GetDataHandler(); + dataHandlerItem = GetDataHandler(); else await Task.Delay(1000, cancellationToken); } @@ -69,26 +69,19 @@ namespace GBase.DataHandling.Pool _waitingRequesters.Remove(request); - return dataHandler; + return dataHandlerItem; } - private IDataHandler CreateDataHandler(bool overwrite) + private IPoolItem CreateDataHandler(bool overwrite) { IPoolItem item = _poolItemFactory.Create(_dataHandlerFactory.Create()); item.Item.Init(overwrite); _pool.Add(item); - item.InUse = true; - return item.Item; + return item; } - private IDataHandler GetDataHandler() - { - IPoolItem item = _pool.First(i => !i.InUse); - - item.InUse = true; - return item.Item; - } + private IPoolItem GetDataHandler() => _pool.First(i => !i.InUse); public async ValueTask DisposeAsync() { diff --git a/GBase/GBaseTable.cs b/GBase/GBaseTable.cs index 23912cc..4a20a1a 100644 --- a/GBase/GBaseTable.cs +++ b/GBase/GBaseTable.cs @@ -104,9 +104,9 @@ namespace GBase List parameters = new List(); foreach (var column in Columns) { - IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); + using IPoolItem dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); - parameters.Add(await GenericMethodCaller.CallAsync(dataHandler, + parameters.Add(await GenericMethodCaller.CallAsync(dataHandlerItem.Use(), nameof(IDataHandler.GetValue), BindingFlags.Public | BindingFlags.Instance, typeof(T), column.Type, @@ -161,8 +161,8 @@ namespace GBase Entries.Add(entry); using IGBaseFile file = _fileHandler.CreateEntryFile(entry, this); - IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); - await dataHandler.AddEntry(entry, this, file.File, cancellationToken); + using IPoolItem dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); + await dataHandlerItem.Use().AddEntry(entry, this, file.File, cancellationToken); return true; } @@ -185,22 +185,22 @@ namespace GBase public async Task SetValue(T entry, string propertyName, TProperty value, CancellationToken cancellationToken) { using IGBaseFile file = await _fileHandler.RequestEntryFile(entry); - IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); - await dataHandler.SetValue(file.File, propertyName, value, cancellationToken); + using IPoolItem dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); + await dataHandlerItem.Use().SetValue(file.File, propertyName, value, cancellationToken); } public async Task GetValue(T entry, string propertyName, CancellationToken cancellationToken) { using IGBaseFile file = await _fileHandler.RequestEntryFile(entry); - IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); - return await dataHandler.GetValue(file.File, propertyName, cancellationToken); + using IPoolItem dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); + return await dataHandlerItem.Use().GetValue(file.File, propertyName, cancellationToken); } public async Task> GetValues(T entry, string propertyName, CancellationToken cancellationToken) { using IGBaseFile file = await _fileHandler.RequestEntryFile(entry); - IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); - return await dataHandler.GetValues(file.File, propertyName, cancellationToken); + using IPoolItem dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); + return await dataHandlerItem.Use().GetValues(file.File, propertyName, cancellationToken); } /// diff --git a/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs b/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs index ccece22..7d630f0 100644 --- a/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs +++ b/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs @@ -10,6 +10,6 @@ namespace GBase.Interfaces.DataHandling.Pool { public interface IDataHandlerPool : IAsyncDisposable { - Task RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken); + Task> RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken); } } \ No newline at end of file