internal DiskCacheConfig(Builder builder)
 {
     _version                         = builder._version;
     _baseDirectoryName               = Preconditions.CheckNotNull(builder._baseDirectoryName);
     _baseDirectoryPathSupplier       = Preconditions.CheckNotNull(builder._baseDirectoryPathSupplier);
     _defaultSizeLimit                = builder._maxCacheSize;
     _lowDiskSpaceSizeLimit           = builder._maxCacheSizeOnLowDiskSpace;
     _minimumSizeLimit                = builder._maxCacheSizeOnVeryLowDiskSpace;
     _entryEvictionComparatorSupplier = Preconditions.CheckNotNull(builder._entryEvictionComparatorSupplier);
     _cacheErrorLogger                = builder._cacheErrorLogger ?? NoOpCacheErrorLogger.Instance;
     _cacheEventListener              = builder._cacheEventListener ?? NoOpCacheEventListener.Instance;
     _diskTrimmableRegistry           = builder._diskTrimmableRegistry ?? NoOpDiskTrimmableRegistry.Instance;
     _indexPopulateAtStartupEnabled   = builder._indexPopulateAtStartupEnabled;
 }
 /// <summary>
 /// Provides the logic to determine the eviction order based on entry's
 /// access time and size.
 /// </summary>
 public Builder SetEntryEvictionComparatorSupplier(IEntryEvictionComparatorSupplier supplier)
 {
     _entryEvictionComparatorSupplier = supplier;
     return(this);
 }
        /// <summary>
        /// Instantiates the <see cref="DiskStorageCache"/>.
        /// </summary>
        public DiskStorageCache(
            IDiskStorage diskStorage,
            IEntryEvictionComparatorSupplier entryEvictionComparatorSupplier,
            Params parameters,
            ICacheEventListener cacheEventListener,
            ICacheErrorLogger cacheErrorLogger,
            IDiskTrimmableRegistry diskTrimmableRegistry,
            bool indexPopulateAtStartupEnabled,
            Clock clock = null)
        {
            _lowDiskSpaceCacheSizeLimit = parameters.LowDiskSpaceCacheSizeLimit;
            _defaultCacheSizeLimit      = parameters.DefaultCacheSizeLimit;
            _cacheSizeLimit             = parameters.DefaultCacheSizeLimit;
            _statFsHelper = StatFsHelper.Instance;

            _storage = diskStorage;

            _entryEvictionComparatorSupplier = entryEvictionComparatorSupplier;

            _cacheSizeLastUpdateTime = default(DateTime);

            _cacheEventListener = cacheEventListener;

            _cacheSizeLimitMinimum = parameters.CacheSizeLimitMinimum;

            _cacheErrorLogger = cacheErrorLogger;

            _cacheStats = new CacheStats();

            if (diskTrimmableRegistry != null)
            {
                diskTrimmableRegistry.RegisterDiskTrimmable(this);
            }

            _clock = clock ?? SystemClock.Get();

            _indexPopulateAtStartupEnabled = indexPopulateAtStartupEnabled;

            _resourceIndex = new HashSet <string>();

            if (_indexPopulateAtStartupEnabled)
            {
                Task.Run(() =>
                {
                    try
                    {
                        lock (_lock)
                        {
                            MaybeUpdateFileCacheSize();
                        }
                    }
                    finally
                    {
                        _countdownEvent.Signal();
                    }
                });
            }
            else
            {
                _countdownEvent.Reset(0);
            }
        }