diff --git a/src/LibHac/Fs/FileSystemClient.cs b/src/LibHac/Fs/FileSystemClient.cs index d61cf1ca..703a1134 100644 --- a/src/LibHac/Fs/FileSystemClient.cs +++ b/src/LibHac/Fs/FileSystemClient.cs @@ -1,10 +1,11 @@ -using LibHac.Fs.Fsa; +using System; +using LibHac.Fs.Fsa; using LibHac.Fs.Shim; using LibHac.FsSystem; namespace LibHac.Fs { - public class FileSystemClient + public class FileSystemClient : IDisposable { internal FileSystemClientGlobals Globals; @@ -15,9 +16,14 @@ namespace LibHac.Fs { Globals.Initialize(this, horizonClient); } + + public void Dispose() + { + Globals.Dispose(); + } } - internal struct FileSystemClientGlobals + internal struct FileSystemClientGlobals : IDisposable { public HorizonClient Hos; public object InitMutex; @@ -37,6 +43,11 @@ namespace LibHac.Fs FsContextHandler.Initialize(fsClient); DirectorySaveDataFileSystem.Initialize(fsClient); } + + public void Dispose() + { + FileSystemProxyServiceObject.Dispose(); + } } // Functions in the nn::fs::detail namespace use this struct. diff --git a/src/LibHac/Fs/Fsa/IFileSystem.cs b/src/LibHac/Fs/Fsa/IFileSystem.cs index d883a6fa..809a3632 100644 --- a/src/LibHac/Fs/Fsa/IFileSystem.cs +++ b/src/LibHac/Fs/Fsa/IFileSystem.cs @@ -229,10 +229,7 @@ namespace LibHac.Fs.Fsa public Result OpenFile(ref UniqueRef file, in Path path, OpenMode mode) { if ((mode & OpenMode.ReadWrite) == 0 || (mode & ~OpenMode.All) != 0) - { - UnsafeHelpers.SkipParamInit(out file); return ResultFs.InvalidOpenMode.Log(); - } return DoOpenFile(ref file, in path, mode); } diff --git a/src/LibHac/Fs/Fsa/UserFileSystem.cs b/src/LibHac/Fs/Fsa/UserFileSystem.cs index 37d638cc..8f84ddee 100644 --- a/src/LibHac/Fs/Fsa/UserFileSystem.cs +++ b/src/LibHac/Fs/Fsa/UserFileSystem.cs @@ -573,7 +573,7 @@ namespace LibHac.Fs.Fsa rc = fileSystem.OpenDirectory(ref accessor.Ref(), subPath, mode); Tick end = fs.Hos.Os.GetSystemTick(); - fs.Impl.OutputAccessLog(rc, start, end, accessor, new U8Span(logBuffer)); + fs.Impl.OutputAccessLog(rc, start, end, accessor.Get, new U8Span(logBuffer)); } else { diff --git a/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs b/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs index 77b976e4..0f66e36f 100644 --- a/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs +++ b/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs @@ -1,9 +1,10 @@ -using LibHac.Common; +using System; +using LibHac.Common; using LibHac.FsSrv.Sf; namespace LibHac.Fs.Shim { - internal struct FileSystemProxyServiceObjectGlobals + internal struct FileSystemProxyServiceObjectGlobals : IDisposable { public nint FileSystemProxyServiceObjectInitGuard; public SharedRef FileSystemProxyServiceObject; @@ -15,6 +16,20 @@ namespace LibHac.Fs.Shim public SharedRef ProgramRegistryServiceObject; public SharedRef DfcFileSystemProxyServiceObject; + + public void Dispose() + { + FileSystemProxyServiceObject.Destroy(); + FileSystemProxyServiceObjectInitGuard = default; + + FileSystemProxyForLoaderServiceObject.Destroy(); + FileSystemProxyForLoaderServiceObjectInitGuard = default; + + ProgramRegistryServiceObject.Destroy(); + ProgramRegistryServiceObjectInitGuard = default; + + DfcFileSystemProxyServiceObject.Destroy(); + } } public static class FileSystemProxyServiceObject diff --git a/src/LibHac/FsSrv/BaseStorageService.cs b/src/LibHac/FsSrv/BaseStorageService.cs index 62482c68..afcf59b3 100644 --- a/src/LibHac/FsSrv/BaseStorageService.cs +++ b/src/LibHac/FsSrv/BaseStorageService.cs @@ -180,9 +180,13 @@ namespace LibHac.FsSrv { private Configuration _config; + // LibHac addition + private SharedRef _deviceOperator; + public BaseStorageServiceImpl(in Configuration configuration) { _config = configuration; + _deviceOperator = new SharedRef(configuration.DeviceOperator); } public struct Configuration @@ -193,7 +197,7 @@ namespace LibHac.FsSrv // LibHac additions public FileSystemServer FsServer; // Todo: The DeviceOperator in FS uses mostly global state. Decide how to handle this. - public SharedRef DeviceOperator; + public IDeviceOperator DeviceOperator; } internal Result GetProgramInfo(out ProgramInfo programInfo, ulong processId) @@ -232,7 +236,7 @@ namespace LibHac.FsSrv internal Result OpenDeviceOperator(ref SharedRef outDeviceOperator, AccessControl accessControl) { - outDeviceOperator.SetByCopy(ref _config.DeviceOperator); + outDeviceOperator.SetByCopy(ref _deviceOperator); return Result.Success; } } diff --git a/src/LibHac/FsSrv/FileSystemServerInitializer.cs b/src/LibHac/FsSrv/FileSystemServerInitializer.cs index 90614ce7..5155648d 100644 --- a/src/LibHac/FsSrv/FileSystemServerInitializer.cs +++ b/src/LibHac/FsSrv/FileSystemServerInitializer.cs @@ -88,7 +88,7 @@ namespace LibHac.FsSrv baseStorageConfig.BisStorageCreator = config.FsCreators.BuiltInStorageCreator; baseStorageConfig.GameCardStorageCreator = config.FsCreators.GameCardStorageCreator; baseStorageConfig.FsServer = server; - baseStorageConfig.DeviceOperator = new SharedRef(config.DeviceOperator); + baseStorageConfig.DeviceOperator = config.DeviceOperator; var baseStorageService = new BaseStorageServiceImpl(in baseStorageConfig); var timeService = new TimeServiceImpl(server); diff --git a/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs b/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs index 228421e4..c53863f5 100644 --- a/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs +++ b/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs @@ -14,7 +14,7 @@ namespace LibHac.FsSrv.Impl protected DeepRetryFileSystem(ref SharedRef baseFileSystem, ref SharedRef accessFailureManager) : base(ref baseFileSystem) { - _accessFailureManager = Shared.Move(ref accessFailureManager); + _accessFailureManager = SharedRef.CreateMove(ref accessFailureManager); } public static SharedRef CreateShared(ref SharedRef baseFileSystem, diff --git a/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs b/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs index f9c9965c..727e11e8 100644 --- a/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs +++ b/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs @@ -60,7 +60,7 @@ namespace LibHac.FsSrv.Impl while (currentEntry is not null) { ref Cache entry = ref currentEntry.ValueRef; - _accessorList.Remove(entry); + _accessorList.Remove(currentEntry); entry.Dispose(); currentEntry = _accessorList.First; @@ -69,15 +69,15 @@ namespace LibHac.FsSrv.Impl _accessorList.Clear(); } - public Result Register(ref SharedRef accessor, - SaveDataSpaceId spaceId, ulong saveDataId) + public Result Register(ref SharedRef accessor, SaveDataSpaceId spaceId, + ulong saveDataId) { - var cache = new Cache(ref accessor, spaceId, saveDataId); + var node = new LinkedListNode(new Cache(ref accessor, spaceId, saveDataId)); using (ScopedLock.Lock(ref _mutex)) { UnregisterImpl(spaceId, saveDataId); - _accessorList.AddLast(cache); + _accessorList.AddLast(node); } return Result.Success; diff --git a/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs b/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs index f2ce0709..52c8fee9 100644 --- a/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs +++ b/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs @@ -155,7 +155,7 @@ namespace LibHac.FsSrv { if (type == FileSystemProxyType.Package) { - outFileSystem = nspFileSystem; + outFileSystem.SetByMove(ref nspFileSystem.Ref()); return Result.Success; } @@ -649,7 +649,7 @@ namespace LibHac.FsSrv switch (fsType) { case FileSystemProxyType.Package: - outFileSystem = baseFileSystem; + outFileSystem.SetByMove(ref baseFileSystem); return Result.Success; case FileSystemProxyType.Code: diff --git a/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs b/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs index 5f6d001b..19d673f5 100644 --- a/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs +++ b/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs @@ -386,8 +386,7 @@ namespace LibHac.FsSrv { Assert.SdkRequires(Globals.Mutex.IsLockedByCurrentThread()); - var entry = new Entry(ref storage, spaceId, saveDataId); - _entryList.AddLast(entry); + _entryList.AddLast(new Entry(ref storage, spaceId, saveDataId)); return Result.Success; } diff --git a/src/LibHac/HorizonClient.cs b/src/LibHac/HorizonClient.cs index f03b5ac9..a56e84a0 100644 --- a/src/LibHac/HorizonClient.cs +++ b/src/LibHac/HorizonClient.cs @@ -8,7 +8,7 @@ using LibHac.Sm; namespace LibHac { - public class HorizonClient + public class HorizonClient : IDisposable { // ReSharper disable once UnusedAutoPropertyAccessor.Local private Horizon Horizon { get; } @@ -37,6 +37,12 @@ namespace LibHac ArpLazy = new Lazy(InitArpClient, true); } + public void Dispose() + { + Fs.Dispose(); + Lr.Dispose(); + } + private ArpClient InitArpClient() { return new ArpClient(this); diff --git a/src/LibHac/Lr/LrClient.cs b/src/LibHac/Lr/LrClient.cs index 17e600e0..f8d47414 100644 --- a/src/LibHac/Lr/LrClient.cs +++ b/src/LibHac/Lr/LrClient.cs @@ -18,7 +18,7 @@ namespace LibHac.Lr } } - internal struct LrClientGlobals + internal struct LrClientGlobals : IDisposable { public HorizonClient Hos; public LrServiceGlobals LrService; diff --git a/src/LibHac/Lr/LrService.cs b/src/LibHac/Lr/LrService.cs index c185c8c5..9da646dd 100644 --- a/src/LibHac/Lr/LrService.cs +++ b/src/LibHac/Lr/LrService.cs @@ -1,11 +1,12 @@ -using LibHac.Common; +using System; +using LibHac.Common; using LibHac.Diag; using LibHac.Ncm; using LibHac.Os; namespace LibHac.Lr { - internal struct LrServiceGlobals + internal struct LrServiceGlobals : IDisposable { public SharedRef LocationResolver; public SdkMutexType InitializationMutex;