public static TrackingPool <TResource> CreateAndAssignTrackingResourceStash <TKey, TResource>( this IChunkCacheBuilder <TKey, TResource> builder, long approximateCapacityInBytes, ChunkCacheBuilderOptions <TResource> options = null) { Contracts.Requires.That(builder != null); Contracts.Requires.That(approximateCapacityInBytes > 0); var poolOptions = new TrackingPoolOptions <TResource>(); options = HandleOptions(poolOptions, options); poolOptions.BoundedCapacity = builder.CalculateResourcePoolCapacity(approximateCapacityInBytes); TrackingPool <TResource> pool; if (options.EagerFillPool) { pool = Pool.Tracking.New(poolOptions); pool.GiveUntilFull(builder.ResourceFactory); } else { pool = Pool.Tracking.WithFactory.Bounded.New(builder.ResourceFactory, poolOptions); } builder.ResourceStash = PoolStash.Create <TKey, TResource>(pool, options.StashCapacityMultiplier); return(pool); }
public static void Build <TKey, TChunk, TReadOnlyChunk, TResource>( IChunkCacheBuilder <TKey, TChunk, TReadOnlyChunk, TResource> instance) where TChunk : TReadOnlyChunk { Contracts.Requires.That(instance != null); Contracts.Requires.That(instance.ResourceStash != null); }
public static int CalculateResourcePoolCapacity <TKey, TResource>( this IChunkCacheBuilder <TKey, TResource> builder, long approximateCapacityInBytes) { Contracts.Requires.That(builder != null); Contracts.Requires.That(approximateCapacityInBytes > 0); long result = approximateCapacityInBytes / builder.ChunkConfig.ApproximateSizeInBytes; return((int)result.Clamp(1, int.MaxValue)); }