forked from Mirror/Ryujinx
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:
parent
383c039037
commit
cc60ba9d22
2 changed files with 24 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue