From 351f5ad5e0ec7f0fe703888b7fd5a3770a330e15 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 12 Jan 2020 14:33:07 -0500 Subject: fix recursive lock error --- src/SMAPI/Framework/ContentCoordinator.cs | 48 +++++++++++++++---------------- 1 file changed, 23 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/SMAPI/Framework/ContentCoordinator.cs b/src/SMAPI/Framework/ContentCoordinator.cs index 0e62837c..b2bacea6 100644 --- a/src/SMAPI/Framework/ContentCoordinator.cs +++ b/src/SMAPI/Framework/ContentCoordinator.cs @@ -193,16 +193,15 @@ namespace StardewModdingAPI.Framework /// The internal SMAPI asset key. public T LoadManagedAsset(string contentManagerID, string relativePath) { - return this.ContentManagerLock.InReadLock(() => - { - // get content manager - IContentManager contentManager = this.ContentManagers.FirstOrDefault(p => p.IsNamespaced && p.Name == contentManagerID); - if (contentManager == null) - throw new InvalidOperationException($"The '{contentManagerID}' prefix isn't handled by any mod."); + // get content manager + IContentManager contentManager = this.ContentManagerLock.InReadLock(() => + this.ContentManagers.FirstOrDefault(p => p.IsNamespaced && p.Name == contentManagerID) + ); + if (contentManager == null) + throw new InvalidOperationException($"The '{contentManagerID}' prefix isn't handled by any mod."); - // get fresh asset - return contentManager.Load(relativePath, this.DefaultLanguage, useCache: false); - }); + // get fresh asset + return contentManager.Load(relativePath, this.DefaultLanguage, useCache: false); } /// Purge matched assets from the cache. @@ -225,10 +224,10 @@ namespace StardewModdingAPI.Framework /// Returns the invalidated asset names. public IEnumerable InvalidateCache(Func predicate, bool dispose = false) { - return this.ContentManagerLock.InReadLock(() => + // invalidate cache & track removed assets + IDictionary> removedAssets = new Dictionary>(StringComparer.InvariantCultureIgnoreCase); + this.ContentManagerLock.InReadLock(() => { - // invalidate cache & track removed assets - IDictionary> removedAssets = new Dictionary>(StringComparer.InvariantCultureIgnoreCase); foreach (IContentManager contentManager in this.ContentManagers) { foreach (var entry in contentManager.InvalidateCache(predicate, dispose)) @@ -238,18 +237,18 @@ namespace StardewModdingAPI.Framework assets.Add(entry.Value); } } + }); - // reload core game assets - if (removedAssets.Any()) - { - IDictionary propagated = this.CoreAssets.Propagate(this.MainContentManager, removedAssets.ToDictionary(p => p.Key, p => p.Value.First().GetType())); // use an intercepted content manager - this.Monitor.Log($"Invalidated {removedAssets.Count} asset names ({string.Join(", ", removedAssets.Keys.OrderBy(p => p, StringComparer.InvariantCultureIgnoreCase))}); propagated {propagated.Count(p => p.Value)} core assets.", LogLevel.Trace); - } - else - this.Monitor.Log("Invalidated 0 cache entries.", LogLevel.Trace); + // reload core game assets + if (removedAssets.Any()) + { + IDictionary propagated = this.CoreAssets.Propagate(this.MainContentManager, removedAssets.ToDictionary(p => p.Key, p => p.Value.First().GetType())); // use an intercepted content manager + this.Monitor.Log($"Invalidated {removedAssets.Count} asset names ({string.Join(", ", removedAssets.Keys.OrderBy(p => p, StringComparer.InvariantCultureIgnoreCase))}); propagated {propagated.Count(p => p.Value)} core assets.", LogLevel.Trace); + } + else + this.Monitor.Log("Invalidated 0 cache entries.", LogLevel.Trace); - return removedAssets.Keys; - }); + return removedAssets.Keys; } /// Dispose held resources. @@ -280,9 +279,8 @@ namespace StardewModdingAPI.Framework return; this.ContentManagerLock.InWriteLock(() => - { - this.ContentManagers.Remove(contentManager); - }); + this.ContentManagers.Remove(contentManager) + ); } } } -- cgit