internal DiskManager(EngineSettings settings, Factories factories, IPieceWriter?writer = null) { ReadLimiter = new RateLimiter(); ReadQueue = new Queue <BufferedIO> (); WriteLimiter = new RateLimiter(); WriteQueue = new Queue <BufferedIO> (); UpdateTimer = ValueStopwatch.StartNew(); Factories = factories ?? throw new ArgumentNullException(nameof(factories)); Settings = settings ?? throw new ArgumentNullException(nameof(settings)); writer ??= factories.CreatePieceWriter(settings.MaximumOpenFiles); Cache = factories.CreateBlockCache(writer, settings.DiskCacheBytes, BufferPool); Cache.ReadThroughCache += (o, e) => WriterReadMonitor.AddDelta(e.RequestLength); Cache.WrittenThroughCache += (o, e) => WriterWriteMonitor.AddDelta(e.RequestLength); IncrementalHashCache = new Cache <IncrementalHashData> (() => new IncrementalHashData()); }