/// <summary> /// Removes the specified definition. /// </summary> /// <param name="definition">The definition.</param> public void Remove(IDefinition definition) { if (definition.IsFromGame) { gameDefinitionsCount--; } if (gameDefinitionsCount < 0) { gameDefinitionsCount = 0; } definitions.Remove(definition); var hierarchicalDefinition = mainHierarchalDefinitions.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), ResolveHierarchalParentDirectory(definition)); if (hierarchicalDefinition != null) { if (childHierarchicalDefinitions.TryGetValue(hierarchicalDefinition.Name, out var children)) { var child = children.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), definition.Id); if (child != null) { children.Remove(child); } if (!children.Select(p => p).Any()) { childHierarchicalDefinitions.TryRemove(hierarchicalDefinition.Name, out _); mainHierarchalDefinitions.Remove(hierarchicalDefinition); } } } }
/// <summary> /// Removes the specified definition. /// </summary> /// <param name="definition">The definition.</param> public void Remove(IDefinition definition) { definitions.Remove(definition); var hierarchicalDefinition = mainHierarchalDefinitions.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), definition.ParentDirectoryCI); if (hierarchicalDefinition != null) { if (childHierarchicalDefinitions.TryGetValue(hierarchicalDefinition.Name, out var children)) { var child = children.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), definition.Id); if (child != null) { children.Remove(child); } if (children.Select(p => p).Count() == 0) { childHierarchicalDefinitions.TryRemove(hierarchicalDefinition.Name, out _); mainHierarchalDefinitions.Remove(hierarchicalDefinition); } } } }
/// <summary> /// Removes the specified definition. /// </summary> /// <param name="definition">The definition.</param> public void Remove(IDefinition definition) { if (definition.IsFromGame) { gameDefinitionsCount--; } if (gameDefinitionsCount < 0) { gameDefinitionsCount = 0; } AddOrRemoveFromResetDefinitions(definition, false); definitions.Remove(definition); var hierarchicalDefinition = mainHierarchalDefinitions.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), ResolveHierarchalParentDirectory(definition)); if (hierarchicalDefinition != null) { if (childHierarchicalDefinitions.TryGetValue(hierarchicalDefinition.Name, out var children)) { var child = children.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), definition.Id); if (child != null) { children.Remove(child); } bool removed = false; if (!children.Select(p => p).Any()) { removed = true; childHierarchicalDefinitions.TryRemove(hierarchicalDefinition.Name, out _); mainHierarchalDefinitions.Remove(hierarchicalDefinition); } if (!removed) { hierarchicalDefinition.ResetType = children.Any() && children.Any(p => p.ResetType != ResetType.None) ? ResetType.Any : ResetType.None; } } } }
/// <summary> /// Performs evictions based on expiry dates, cache size, etc. then ensures the persisted cache index is updated. /// </summary> /// <param name="honorShutdown"></param> private void Cleanup(bool honorShutdown) { SaveUncommitted(honorShutdown); if (honorShutdown && Interlocked.Read(ref _stopping) > 0) { return; } // In final cleanup don't worry about evictions if (honorShutdown) { DateTime d = DateTime.Now; var remove = (from a in _index where !a.Active || a.ExpiryDate < d || (!string.IsNullOrEmpty(a.FileName) && !File.Exists(Path.Combine(RootDirectory, a.FileName))) select a).ToList(); if ((_index.Count - remove.Count) > MaximumItemCount) { var discard = MaximumItemCount - _index.Count + remove.Count; remove.AddRange((from a in _index where a.Active orderby a.ReadCount ascending, a.LastRead select a).Take(discard)); } if (Interlocked.Read(ref _stopping) > 0) { return; } Parallel.ForEach(remove, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount > 4 ? Environment.ProcessorCount >> 2: 1 }, (c, pls) => { if (Interlocked.Read(ref _stopping) > 0) { pls.Break(); return; } try { if (!string.IsNullOrEmpty(c.FileName) && File.Exists(Path.Combine(RootDirectory, c.FileName))) { File.Delete(Path.Combine(RootDirectory, c.FileName)); } _index.Remove(c); } catch (Exception ex) { CEFDebug.WriteInfo($"Exception in cache cleanup: {ex.Message}"); } }); if (Interlocked.Read(ref _stopping) > 0) { return; } } SaveIndex(honorShutdown); }