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());
        }