mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Use save data caches in SaveDataFileSystemServiceImpl
This commit is contained in:
parent
ed8ef13bfd
commit
7aae39c358
1 changed files with 33 additions and 9 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue