- requestDataHandler now returns IPoolItem<IDataHandler> so that InUse can be set to false again

master
Simon G 5 years ago
parent 1ea6d259bc
commit 1b0610c514
  1. 25
      GBase/DataHandling/Pool/DataHandlerPool.cs
  2. 20
      GBase/GBaseTable.cs
  3. 2
      GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs

@ -37,7 +37,7 @@ namespace GBase.DataHandling.Pool
_waitingRequesters = new List<IPoolRequest>(); _waitingRequesters = new List<IPoolRequest>();
} }
public async Task<IDataHandler> RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken) public async Task<IPoolItem<IDataHandler>> RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken)
{ {
if (_pool.All(i => i.InUse) && _pool.Count == _availableDataHandlers) //no free dataHandlers available if (_pool.All(i => i.InUse) && _pool.Count == _availableDataHandlers) //no free dataHandlers available
return await WaitForDataHandler(requester, cancellationToken); return await WaitForDataHandler(requester, cancellationToken);
@ -47,17 +47,17 @@ namespace GBase.DataHandling.Pool
return GetDataHandler(); return GetDataHandler();
} }
private async Task<IDataHandler> WaitForDataHandler(object requester, CancellationToken cancellationToken) private async Task<IPoolItem<IDataHandler>> WaitForDataHandler(object requester, CancellationToken cancellationToken)
{ {
IDataHandler dataHandler = null; IPoolItem<IDataHandler> dataHandlerItem = null;
IPoolRequest request = _poolRequestFactory.Create(requester); 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 (_waitingRequesters.Contains(request) && _waitingRequesters.IndexOf(request) == 0) //request is in list and is first
{ {
if (_pool.Any(i => !i.InUse)) if (_pool.Any(i => !i.InUse))
dataHandler = GetDataHandler(); dataHandlerItem = GetDataHandler();
else else
await Task.Delay(1000, cancellationToken); await Task.Delay(1000, cancellationToken);
} }
@ -69,26 +69,19 @@ namespace GBase.DataHandling.Pool
_waitingRequesters.Remove(request); _waitingRequesters.Remove(request);
return dataHandler; return dataHandlerItem;
} }
private IDataHandler CreateDataHandler(bool overwrite) private IPoolItem<IDataHandler> CreateDataHandler(bool overwrite)
{ {
IPoolItem<IDataHandler> item = _poolItemFactory.Create(_dataHandlerFactory.Create()); IPoolItem<IDataHandler> item = _poolItemFactory.Create(_dataHandlerFactory.Create());
item.Item.Init(overwrite); item.Item.Init(overwrite);
_pool.Add(item); _pool.Add(item);
item.InUse = true; return item;
return item.Item;
} }
private IDataHandler GetDataHandler() private IPoolItem<IDataHandler> GetDataHandler() => _pool.First(i => !i.InUse);
{
IPoolItem<IDataHandler> item = _pool.First(i => !i.InUse);
item.InUse = true;
return item.Item;
}
public async ValueTask DisposeAsync() public async ValueTask DisposeAsync()
{ {

@ -104,9 +104,9 @@ namespace GBase
List<object> parameters = new List<object>(); List<object> parameters = new List<object>();
foreach (var column in Columns) foreach (var column in Columns)
{ {
IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); using IPoolItem<IDataHandler> dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken);
parameters.Add(await GenericMethodCaller.CallAsync(dataHandler, parameters.Add(await GenericMethodCaller.CallAsync(dataHandlerItem.Use(),
nameof(IDataHandler.GetValue), nameof(IDataHandler.GetValue),
BindingFlags.Public | BindingFlags.Instance, BindingFlags.Public | BindingFlags.Instance,
typeof(T), column.Type, typeof(T), column.Type,
@ -161,8 +161,8 @@ namespace GBase
Entries.Add(entry); Entries.Add(entry);
using IGBaseFile file = _fileHandler.CreateEntryFile(entry, this); using IGBaseFile file = _fileHandler.CreateEntryFile(entry, this);
IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); using IPoolItem<IDataHandler> dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken);
await dataHandler.AddEntry(entry, this, file.File, cancellationToken); await dataHandlerItem.Use().AddEntry(entry, this, file.File, cancellationToken);
return true; return true;
} }
@ -185,22 +185,22 @@ namespace GBase
public async Task SetValue<TProperty>(T entry, string propertyName, TProperty value, CancellationToken cancellationToken) public async Task SetValue<TProperty>(T entry, string propertyName, TProperty value, CancellationToken cancellationToken)
{ {
using IGBaseFile file = await _fileHandler.RequestEntryFile(entry); using IGBaseFile file = await _fileHandler.RequestEntryFile(entry);
IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); using IPoolItem<IDataHandler> dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken);
await dataHandler.SetValue<T, TProperty>(file.File, propertyName, value, cancellationToken); await dataHandlerItem.Use().SetValue<T, TProperty>(file.File, propertyName, value, cancellationToken);
} }
public async Task<TProperty> GetValue<TProperty>(T entry, string propertyName, CancellationToken cancellationToken) public async Task<TProperty> GetValue<TProperty>(T entry, string propertyName, CancellationToken cancellationToken)
{ {
using IGBaseFile file = await _fileHandler.RequestEntryFile(entry); using IGBaseFile file = await _fileHandler.RequestEntryFile(entry);
IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); using IPoolItem<IDataHandler> dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken);
return await dataHandler.GetValue<T, TProperty>(file.File, propertyName, cancellationToken); return await dataHandlerItem.Use().GetValue<T, TProperty>(file.File, propertyName, cancellationToken);
} }
public async Task<IEnumerable<TProperty>> GetValues<TProperty>(T entry, string propertyName, CancellationToken cancellationToken) public async Task<IEnumerable<TProperty>> GetValues<TProperty>(T entry, string propertyName, CancellationToken cancellationToken)
{ {
using IGBaseFile file = await _fileHandler.RequestEntryFile(entry); using IGBaseFile file = await _fileHandler.RequestEntryFile(entry);
IDataHandler dataHandler = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken); using IPoolItem<IDataHandler> dataHandlerItem = await _dataHandlerPool.RequestDataHandler(this, false, cancellationToken);
return await dataHandler.GetValues<T, TProperty>(file.File, propertyName, cancellationToken); return await dataHandlerItem.Use().GetValues<T, TProperty>(file.File, propertyName, cancellationToken);
} }
/// <summary> /// <summary>

@ -10,6 +10,6 @@ namespace GBase.Interfaces.DataHandling.Pool
{ {
public interface IDataHandlerPool : IAsyncDisposable public interface IDataHandlerPool : IAsyncDisposable
{ {
Task<IDataHandler> RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken); Task<IPoolItem<IDataHandler>> RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken);
} }
} }
Loading…
Cancel
Save