Просмотр исходного кода

shader cache: Fix possible race causing crashes on manifest at startup (#1718)

* shader cache: Fix possible race causing crashes on manifest at startup

This fix a misplace function call ending up causing possibly two write
on the cache.info at the same time.

* shader cache: Make RemoveManifestEntries async too to be sure all operations are perform before starting the game
Mary 5 лет назад
Родитель
Сommit
cc60ba9d22

+ 22 - 1
Ryujinx.Graphics.Gpu/Shader/Cache/CacheCollection.cs

@@ -33,6 +33,11 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
             /// </summary>
             SaveManifest,
 
+            /// <summary>
+            /// Remove entries from the hash manifest and save it.
+            /// </summary>
+            RemoveManifestEntries,
+
             /// <summary>
             /// Flush temporary cache to archive.
             /// </summary>
@@ -227,11 +232,24 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
             FlushToArchive();
         }
 
+        /// <summary>
+        /// Queue a task to remove entries from the hash manifest.
+        /// </summary>
+        /// <param name="entries">Entries to remove from the manifest</param>
+        public void RemoveManifestEntriesAsync(HashSet<Hash128> entries)
+        {
+            _fileWriterWorkerQueue.Add(new CacheFileOperationTask
+            {
+                Type = CacheFileOperation.RemoveManifestEntries,
+                Data = entries
+            });
+        }
+
         /// <summary>
         /// Remove given entries from the manifest.
         /// </summary>
         /// <param name="entries">Entries to remove from the manifest</param>
-        public void RemoveManifestEntries(HashSet<Hash128> entries)
+        private void RemoveManifestEntries(HashSet<Hash128> entries)
         {
             lock (_hashTable)
             {
@@ -488,6 +506,9 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
                 case CacheFileOperation.SaveManifest:
                     SaveManifest();
                     break;
+                case CacheFileOperation.RemoveManifestEntries:
+                    RemoveManifestEntries((HashSet<Hash128>)task.Data);
+                    break;
                 case CacheFileOperation.FlushToArchive:
                     FlushToArchive();
                     break;

+ 2 - 2
Ryujinx.Graphics.Gpu/Shader/Cache/CacheManager.cs

@@ -58,8 +58,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
         /// <param name="entries">Entries to remove from the manifest of all caches</param>
         public void RemoveManifestEntries(HashSet<Hash128> entries)
         {
-            _guestProgramCache.RemoveManifestEntries(entries);
-            _hostProgramCache.RemoveManifestEntries(entries);
+            _guestProgramCache.RemoveManifestEntriesAsync(entries);
+            _hostProgramCache.RemoveManifestEntriesAsync(entries);
         }
 
         /// <summary>