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
This commit is contained in:
Mary 2020-11-17 22:31:05 +01:00 committed by GitHub
parent 383c039037
commit cc60ba9d22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 3 deletions

View file

@ -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;

View file

@ -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>