Use save data caches in SaveDataFileSystemServiceImpl

This commit is contained in:
Alex Barney 2021-05-08 18:19:37 -07:00
parent ed8ef13bfd
commit 7aae39c358

View file

@ -1,13 +1,14 @@
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using LibHac.Common; using LibHac.Common;
using LibHac.Diag;
using LibHac.Fs; using LibHac.Fs;
using LibHac.Fs.Fsa; using LibHac.Fs.Fsa;
using LibHac.FsSrv.FsCreator; using LibHac.FsSrv.FsCreator;
using LibHac.FsSrv.Impl; using LibHac.FsSrv.Impl;
using LibHac.FsSystem; using LibHac.FsSystem;
using LibHac.FsSystem.Save;
using LibHac.Ncm; using LibHac.Ncm;
using LibHac.Os;
using LibHac.Util; using LibHac.Util;
using Utility = LibHac.FsSrv.Impl.Utility; using Utility = LibHac.FsSrv.Impl.Utility;
@ -18,8 +19,8 @@ namespace LibHac.FsSrv
private Configuration _config; private Configuration _config;
private EncryptionSeed _encryptionSeed; private EncryptionSeed _encryptionSeed;
private ISaveDataFileSystemCacheManager _saveCacheManager; private SaveDataFileSystemCacheManager _saveDataFsCacheManager;
// Save data extra data cache private SaveDataExtraDataAccessorCacheManager _extraDataCacheManager;
// Save data porter manager // Save data porter manager
private bool _isSdCardAccessible; private bool _isSdCardAccessible;
private TimeStampGetter _timeStampGetter; private TimeStampGetter _timeStampGetter;
@ -44,8 +45,13 @@ namespace LibHac.FsSrv
public SaveDataFileSystemServiceImpl(in Configuration configuration) public SaveDataFileSystemServiceImpl(in Configuration configuration)
{ {
_config = configuration; _config = configuration;
_saveDataFsCacheManager = new SaveDataFileSystemCacheManager();
_extraDataCacheManager = new SaveDataExtraDataAccessorCacheManager();
_timeStampGetter = new TimeStampGetter(this); _timeStampGetter = new TimeStampGetter(this);
Result rc = _saveDataFsCacheManager.Initialize(_config.MaxSaveFsCacheCount);
Abort.DoAbortUnless(rc.IsSuccess());
} }
public struct Configuration public struct Configuration
@ -119,7 +125,7 @@ namespace LibHac.FsSrv
UnsafeHelpers.SkipParamInit(out fileSystem); UnsafeHelpers.SkipParamInit(out fileSystem);
ReferenceCountedDisposable<IFileSystem> saveDirectoryFs = null; ReferenceCountedDisposable<IFileSystem> saveDirectoryFs = null;
ReferenceCountedDisposable<SaveDataFileSystem> cachedSaveDataFs = null; ReferenceCountedDisposable<IFileSystem> cachedSaveDataFs = null;
ReferenceCountedDisposable<IFileSystem> saveDataFs = null; ReferenceCountedDisposable<IFileSystem> saveDataFs = null;
try try
{ {
@ -138,18 +144,29 @@ namespace LibHac.FsSrv
if (rc.IsFailure()) return rc; if (rc.IsFailure()) return rc;
} }
if (!allowDirectorySaveData) // Note: Nintendo doesn't cache directory save data
// if (!allowDirectorySaveData)
{ {
// Todo: Missing save FS cache lookup // Check if we have the requested file system cached
if (_saveDataFsCacheManager.GetCache(out cachedSaveDataFs, spaceId, saveDataId))
{
saveDataFs =
SaveDataFileSystemCacheRegisterBase<IFileSystem>.CreateShared(cachedSaveDataFs,
_saveDataFsCacheManager);
saveDataFs = SaveDataResultConvertFileSystem.CreateShared(ref saveDataFs);
}
} }
// ReSharper disable once ConditionIsAlwaysTrueOrFalse // Create a new file system if it's not in the cache
if (saveDataFs is null) if (saveDataFs is null)
{ {
ReferenceCountedDisposable<IFileSystem> saveFs = null; ReferenceCountedDisposable<IFileSystem> saveFs = null;
ReferenceCountedDisposable<ISaveDataExtraDataAccessor> extraDataAccessor = null; ReferenceCountedDisposable<ISaveDataExtraDataAccessor> extraDataAccessor = null;
try try
{ {
using ScopedLock<SdkRecursiveMutex> scopedLock = _extraDataCacheManager.GetScopedLock();
// Todo: Update ISaveDataFileSystemCreator // Todo: Update ISaveDataFileSystemCreator
bool useDeviceUniqueMac = IsDeviceUniqueMac(spaceId); bool useDeviceUniqueMac = IsDeviceUniqueMac(spaceId);
@ -159,14 +176,19 @@ namespace LibHac.FsSrv
saveDataFs = Shared.Move(ref saveFs); saveDataFs = Shared.Move(ref saveFs);
if (cacheExtraData) // Cache the extra data accessor if needed
if (cacheExtraData && extraDataAccessor is not null)
{ {
// Todo: Missing extra data caching extraDataAccessor.Target.RegisterCacheObserver(_extraDataCacheManager, spaceId, saveDataId);
rc = _extraDataCacheManager.Register(extraDataAccessor, spaceId, saveDataId);
if (rc.IsFailure()) return rc;
} }
} }
finally finally
{ {
saveFs?.Dispose(); saveFs?.Dispose();
cachedSaveDataFs?.Dispose();
extraDataAccessor?.Dispose(); extraDataAccessor?.Dispose();
} }
} }
@ -360,6 +382,8 @@ namespace LibHac.FsSrv
ReferenceCountedDisposable<IFileSystem> fileSystem = null; ReferenceCountedDisposable<IFileSystem> fileSystem = null;
try try
{ {
_saveDataFsCacheManager.Unregister(spaceId, saveDataId);
// Open the directory containing the save data // Open the directory containing the save data
Result rc = OpenSaveDataDirectoryFileSystem(out fileSystem, spaceId, saveDataRootPath, false); Result rc = OpenSaveDataDirectoryFileSystem(out fileSystem, spaceId, saveDataRootPath, false);
if (rc.IsFailure()) return rc; if (rc.IsFailure()) return rc;