From f9f31056ef528e3841c467b06fd54956b1927dde Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Mon, 1 Nov 2021 16:02:00 -0700 Subject: [PATCH] Use "in" instead of "ref" where appropriate in SharedRef --- src/LibHac/Bcat/BcatServer.cs | 2 +- src/LibHac/Bcat/Impl/Ipc/BcatServiceObject.cs | 2 +- src/LibHac/Boot/Package1.cs | 55 ++++++++++--------- src/LibHac/Common/SharedRef.cs | 32 +++++------ .../Fs/Shim/FileSystemProxyServiceObject.cs | 9 +-- .../Fs/Shim/FileSystemServiceObjectAdapter.cs | 2 +- src/LibHac/Fs/SubStorage.cs | 10 ++-- src/LibHac/FsSrv/BaseStorageService.cs | 2 +- src/LibHac/FsSrv/DefaultFsServerObjects.cs | 2 +- .../EmulatedBisFileSystemCreatorConfig.cs | 4 +- .../EmulatedGameCardStorageCreator.cs | 4 +- .../EmulatedSdCardFileSystemCreator.cs | 6 +- .../FsCreator/SaveDataFileSystemCreator.cs | 4 +- src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs | 2 +- .../FsSrv/Impl/FileSystemInterfaceAdapter.cs | 10 ++-- .../SaveDataExtraDataAccessorCacheManager.cs | 9 +-- src/LibHac/FsSrv/NcaFileSystemService.cs | 4 +- src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs | 2 +- src/LibHac/FsSrv/SaveDataFileSystemService.cs | 18 +++--- .../FsSrv/SaveDataFileSystemServiceImpl.cs | 2 +- src/LibHac/FsSrv/SaveDataIndexer.cs | 4 +- src/LibHac/FsSrv/SaveDataSharedFileStorage.cs | 5 +- .../SaveDataFileSystemCacheManager.cs | 1 + src/LibHac/FsSystem/StorageExtensions.cs | 2 +- src/hactoolnet/ProcessPackage.cs | 4 +- .../Fs/DirectorySaveDataFileSystemTests.cs | 7 +-- 26 files changed, 105 insertions(+), 99 deletions(-) diff --git a/src/LibHac/Bcat/BcatServer.cs b/src/LibHac/Bcat/BcatServer.cs index 4fdadb39..8a6bb4ba 100644 --- a/src/LibHac/Bcat/BcatServer.cs +++ b/src/LibHac/Bcat/BcatServer.cs @@ -59,7 +59,7 @@ namespace LibHac.Bcat { Debug.Assert((uint)type < ServiceTypeCount); - return SharedRef.CreateCopy(ref _serviceCreators[(int)type]); + return SharedRef.CreateCopy(in _serviceCreators[(int)type]); } } diff --git a/src/LibHac/Bcat/Impl/Ipc/BcatServiceObject.cs b/src/LibHac/Bcat/Impl/Ipc/BcatServiceObject.cs index eeef95d5..f0231aab 100644 --- a/src/LibHac/Bcat/Impl/Ipc/BcatServiceObject.cs +++ b/src/LibHac/Bcat/Impl/Ipc/BcatServiceObject.cs @@ -20,7 +20,7 @@ namespace LibHac.Bcat.Impl.Ipc public Result GetServiceObject(ref SharedRef serviceObject) { - serviceObject.SetByCopy(ref _serviceCreator); + serviceObject.SetByCopy(in _serviceCreator); return Result.Success; } } diff --git a/src/LibHac/Boot/Package1.cs b/src/LibHac/Boot/Package1.cs index 476c51ab..b13348d7 100644 --- a/src/LibHac/Boot/Package1.cs +++ b/src/LibHac/Boot/Package1.cs @@ -81,7 +81,10 @@ namespace LibHac.Boot private const int ModernStage1Size = 0x7000; private const int MarikoWarmBootPlainTextSectionSize = 0x330; - private IStorage BaseStorage { get; set; } + private SharedRef _baseStorage; + private SubStorage _pk11Storage; + private SubStorage _bodyStorage; + private KeySet KeySet { get; set; } public bool IsModern { get; private set; } @@ -94,8 +97,6 @@ namespace LibHac.Boot public byte KeyRevision { get; private set; } public int Pk11Size { get; private set; } - private IStorage Pk11Storage { get; set; } - private IStorage BodyStorage { get; set; } private Package1MarikoOemHeader _marikoOemHeader; private Package1MetaData _metaData; @@ -109,13 +110,13 @@ namespace LibHac.Boot public ref readonly Package1Pk11Header Pk11Header => ref _pk11Header; public ref readonly Buffer16 Pk11Mac => ref _pk11Mac; - public Result Initialize(KeySet keySet, IStorage storage) + public Result Initialize(KeySet keySet, in SharedRef storage) { KeySet = keySet; - BaseStorage = storage; + _baseStorage.SetByCopy(in storage); // Read what might be a mariko header and check if it actually is a mariko header - Result rc = BaseStorage.Read(0, SpanHelpers.AsByteSpan(ref _marikoOemHeader)); + Result rc = _baseStorage.Get.Read(0, SpanHelpers.AsByteSpan(ref _marikoOemHeader)); if (rc.IsFailure()) return rc; IsMariko = IsMarikoImpl(); @@ -127,8 +128,11 @@ namespace LibHac.Boot } else { - BodyStorage = BaseStorage; - rc = BodyStorage.Read(0, SpanHelpers.AsByteSpan(ref _metaData)); + rc = _baseStorage.Get.GetSize(out long baseStorageSize); + if (rc.IsFailure()) return rc.Miss(); + + _bodyStorage = new SubStorage(in _baseStorage, 0, baseStorageSize); + rc = _bodyStorage.Read(0, SpanHelpers.AsByteSpan(ref _metaData)); if (rc.IsFailure()) return rc; } @@ -169,7 +173,7 @@ namespace LibHac.Boot return ResultLibHac.InvalidPackage1MarikoBodySize.Log(); // Verify the body storage size is not smaller than the size in the header - Result rc = BaseStorage.GetSize(out long totalSize); + Result rc = _baseStorage.Get.GetSize(out long totalSize); if (rc.IsFailure()) return rc; long bodySize = totalSize - Unsafe.SizeOf(); @@ -177,7 +181,7 @@ namespace LibHac.Boot return ResultLibHac.InvalidPackage1MarikoBodySize.Log(); // Create body SubStorage and metadata buffers - var bodySubStorage = new SubStorage(BaseStorage, Unsafe.SizeOf(), bodySize); + var bodySubStorage = new SubStorage(in _baseStorage, Unsafe.SizeOf(), bodySize); Span metaData = stackalloc Package1MetaData[2]; Span metaData1 = SpanHelpers.AsByteSpan(ref metaData[0]); @@ -189,7 +193,7 @@ namespace LibHac.Boot // Set the body storage and decrypted metadata _metaData = metaData[0]; - BodyStorage = bodySubStorage; + _bodyStorage = bodySubStorage; // The plaintext metadata is followed by an encrypted copy // If these two match then the body is already decrypted @@ -208,7 +212,8 @@ namespace LibHac.Boot if (IsDecrypted) { var decStorage = new AesCbcStorage(bodySubStorage, KeySet.MarikoBek, _metaData.Iv, true); - BodyStorage = new CachedStorage(decStorage, 0x4000, 1, true); + var cachedStorage = new CachedStorage(decStorage, 0x4000, 1, true); + _bodyStorage = new SubStorage(cachedStorage, 0, bodySize); } return Result.Success; @@ -236,7 +241,7 @@ namespace LibHac.Boot // Read the package1ldr footer int footerOffset = stage1Size - Unsafe.SizeOf(); - Result rc = BodyStorage.Read(footerOffset, SpanHelpers.AsByteSpan(ref _stage1Footer)); + Result rc = _bodyStorage.Read(footerOffset, SpanHelpers.AsByteSpan(ref _stage1Footer)); if (rc.IsFailure()) return rc; // Get the PK11 size from the field in the unencrypted stage 1 footer @@ -249,12 +254,12 @@ namespace LibHac.Boot { int pk11Offset = IsModern ? ModernStage1Size : LegacyStage1Size; - return BodyStorage.Read(pk11Offset, SpanHelpers.AsByteSpan(ref _pk11Header)); + return _bodyStorage.Read(pk11Offset, SpanHelpers.AsByteSpan(ref _pk11Header)); } private Result ReadModernEristaMac() { - return BaseStorage.Read(ModernStage1Size + Pk11Size, _pk11Mac.Bytes); + return _baseStorage.Get.Read(ModernStage1Size + Pk11Size, _pk11Mac.Bytes); } private Result SetPk11Storage() @@ -262,7 +267,7 @@ namespace LibHac.Boot // Read the PK11 header from the body storage int pk11Offset = IsModern ? ModernStage1Size : LegacyStage1Size; - Result rc = BodyStorage.Read(pk11Offset, SpanHelpers.AsByteSpan(ref _pk11Header)); + Result rc = _bodyStorage.Read(pk11Offset, SpanHelpers.AsByteSpan(ref _pk11Header)); if (rc.IsFailure()) return rc; // Check if PK11 is already decrypted, creating the PK11 storage if it is @@ -270,11 +275,11 @@ namespace LibHac.Boot if (IsDecrypted) { - Pk11Storage = new SubStorage(BodyStorage, pk11Offset, Pk11Size); + _pk11Storage = new SubStorage(_bodyStorage, pk11Offset, Pk11Size); return Result.Success; } - var encPk11Storage = new SubStorage(BodyStorage, pk11Offset, Pk11Size); + var encPk11Storage = new SubStorage(_bodyStorage, pk11Offset, Pk11Size); // See if we have an Erista package1 key that can decrypt this PK11 if (!IsMariko && TryFindEristaKeyRevision()) @@ -293,13 +298,13 @@ namespace LibHac.Boot KeySet.Package1Keys[KeyRevision].DataRo.ToArray(), _stage1Footer.Iv.ToArray(), true); } - Pk11Storage = new CachedStorage(decPk11Storage, 0x4000, 1, true); + _pk11Storage = new SubStorage(new CachedStorage(decPk11Storage, 0x4000, 1, true), 0, Pk11Size); return Result.Success; } // We can't decrypt the PK11. Set Pk11Storage to the encrypted PK11 storage - Pk11Storage = encPk11Storage; + _pk11Storage = encPk11Storage; return Result.Success; } @@ -375,15 +380,15 @@ namespace LibHac.Boot // The metadata at the start of the body is unencrypted, so don't take its data from the decrypted // body storage - storages.Add(new SubStorage(BaseStorage, 0, Unsafe.SizeOf() + metaSize)); - storages.Add(new SubStorage(BodyStorage, metaSize, _marikoOemHeader.Size - metaSize)); + storages.Add(new SubStorage(in _baseStorage, 0, Unsafe.SizeOf() + metaSize)); + storages.Add(new SubStorage(_bodyStorage, metaSize, _marikoOemHeader.Size - metaSize)); } else { int stage1Size = IsModern ? ModernStage1Size : LegacyStage1Size; - storages.Add(new SubStorage(BaseStorage, 0, stage1Size)); - storages.Add(Pk11Storage); + storages.Add(new SubStorage(in _baseStorage, 0, stage1Size)); + storages.Add(_pk11Storage); if (IsModern) { @@ -429,7 +434,7 @@ namespace LibHac.Boot int offset = Unsafe.SizeOf() + GetSectionOffset(sectionType); int size = GetSectionSize(sectionType); - return new SubStorage(Pk11Storage, offset, size); + return new SubStorage(_pk11Storage, offset, size); } diff --git a/src/LibHac/Common/SharedRef.cs b/src/LibHac/Common/SharedRef.cs index 64880794..3610bf7f 100644 --- a/src/LibHac/Common/SharedRef.cs +++ b/src/LibHac/Common/SharedRef.cs @@ -156,11 +156,11 @@ namespace LibHac.Common return sharedRef; } - public static SharedRef CreateCopy(ref SharedRef other) where TFrom : class, T + public static SharedRef CreateCopy(in SharedRef other) where TFrom : class, T { var sharedRef = new SharedRef(); - sharedRef._value = Unsafe.As(ref other._value); + sharedRef._value = Unsafe.As(ref other.Ref()._value); sharedRef._refCount = other._refCount; sharedRef._refCount?.Increment(); @@ -168,9 +168,9 @@ namespace LibHac.Common return sharedRef; } - public static SharedRef Create(ref WeakRef other) where TFrom : class, T + public static SharedRef Create(in WeakRef other) where TFrom : class, T { - ref SharedRef otherShared = ref Unsafe.As, SharedRef>(ref other); + ref SharedRef otherShared = ref Unsafe.As, SharedRef>(ref other.Ref()); var sharedRef = new SharedRef(); @@ -244,14 +244,14 @@ namespace LibHac.Common oldRefCount?.Decrement(); } - public void SetByCopy(ref SharedRef other) where TFrom : class, T + public void SetByCopy(in SharedRef other) where TFrom : class, T { RefCount oldRefCount = _refCount; RefCount otherRef = other._refCount; otherRef?.Increment(); - _value = Unsafe.As(ref other._value); + _value = Unsafe.As(ref other.Ref()._value); _refCount = otherRef; oldRefCount?.Decrement(); @@ -309,9 +309,9 @@ namespace LibHac.Common private T _value; private RefCount _refCount; - public WeakRef(ref SharedRef other) + public WeakRef(in SharedRef other) { - this = Create(ref other); + this = Create(in other); } [Obsolete("This method should never be manually called. Use the Destroy method instead.", true)] @@ -350,7 +350,7 @@ namespace LibHac.Common return weakRef; } - public static WeakRef CreateCopy(ref WeakRef other) where TFrom : class, T + public static WeakRef CreateCopy(in WeakRef other) where TFrom : class, T { var weakRef = new WeakRef(); @@ -361,7 +361,7 @@ namespace LibHac.Common if (weakRef._refCount.IncrementIfNotZero()) { - weakRef._value = Unsafe.As(ref other._value); + weakRef._value = Unsafe.As(ref other.Ref()._value); weakRef._refCount.Decrement(); } } @@ -369,9 +369,9 @@ namespace LibHac.Common return weakRef; } - public static WeakRef Create(ref SharedRef other) where TFrom : class, T + public static WeakRef Create(in SharedRef other) where TFrom : class, T { - ref WeakRef otherWeak = ref Unsafe.As, WeakRef>(ref other); + ref WeakRef otherWeak = ref Unsafe.As, WeakRef>(ref other.Ref()); var weakRef = new WeakRef(); @@ -411,16 +411,16 @@ namespace LibHac.Common temp.DisposeInternal(); } - public void SetCopy(ref WeakRef other) where TFrom : class, T + public void SetCopy(in WeakRef other) where TFrom : class, T { - WeakRef temp = CreateCopy(ref other); + WeakRef temp = CreateCopy(in other); Swap(ref temp); temp.DisposeInternal(); } - public void Set(ref SharedRef other) where TFrom : class, T + public void Set(in SharedRef other) where TFrom : class, T { - WeakRef temp = Create(ref other); + WeakRef temp = Create(in other); Swap(ref temp); temp.DisposeInternal(); } diff --git a/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs b/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs index 0f66e36f..59a8c14a 100644 --- a/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs +++ b/src/LibHac/Fs/Shim/FileSystemProxyServiceObject.cs @@ -4,6 +4,7 @@ using LibHac.FsSrv.Sf; namespace LibHac.Fs.Shim { + [NonCopyable] internal struct FileSystemProxyServiceObjectGlobals : IDisposable { public nint FileSystemProxyServiceObjectInitGuard; @@ -46,7 +47,7 @@ namespace LibHac.Fs.Shim g.FileSystemProxyServiceObject.SetByMove(ref createdObject.Ref()); } - return SharedRef.CreateCopy(ref g.FileSystemProxyServiceObject); + return SharedRef.CreateCopy(in g.FileSystemProxyServiceObject); } private static SharedRef GetFileSystemProxyServiceObjectImpl(FileSystemClientImpl fs) @@ -56,7 +57,7 @@ namespace LibHac.Fs.Shim if (dfcServiceObject.HasValue) { - return SharedRef.CreateCopy(ref dfcServiceObject); + return SharedRef.CreateCopy(in dfcServiceObject); } using var fileSystemProxy = new SharedRef(); @@ -84,7 +85,7 @@ namespace LibHac.Fs.Shim g.FileSystemProxyForLoaderServiceObject.SetByMove(ref createdObject.Ref()); } - return SharedRef.CreateCopy(ref g.FileSystemProxyForLoaderServiceObject); + return SharedRef.CreateCopy(in g.FileSystemProxyForLoaderServiceObject); } private static SharedRef GetFileSystemProxyForLoaderServiceObjectImpl( @@ -114,7 +115,7 @@ namespace LibHac.Fs.Shim g.ProgramRegistryServiceObject.SetByMove(ref createdObject.Ref()); } - return SharedRef.CreateCopy(ref g.ProgramRegistryServiceObject); + return SharedRef.CreateCopy(in g.ProgramRegistryServiceObject); } private static SharedRef GetProgramRegistryServiceObjectImpl(FileSystemClientImpl fs) diff --git a/src/LibHac/Fs/Shim/FileSystemServiceObjectAdapter.cs b/src/LibHac/Fs/Shim/FileSystemServiceObjectAdapter.cs index ca813b12..cf69d200 100644 --- a/src/LibHac/Fs/Shim/FileSystemServiceObjectAdapter.cs +++ b/src/LibHac/Fs/Shim/FileSystemServiceObjectAdapter.cs @@ -305,7 +305,7 @@ namespace LibHac.Fs.Impl public SharedRef GetFileSystem() { - return SharedRef.CreateCopy(ref _baseFs); + return SharedRef.CreateCopy(in _baseFs); } public SharedRef GetMultiCommitTarget() diff --git a/src/LibHac/Fs/SubStorage.cs b/src/LibHac/Fs/SubStorage.cs index 96469fe2..e141ac01 100644 --- a/src/LibHac/Fs/SubStorage.cs +++ b/src/LibHac/Fs/SubStorage.cs @@ -49,7 +49,7 @@ namespace LibHac.Fs _offset = other._offset; _size = other._size; _isResizable = other._isResizable; - _sharedBaseStorage = SharedRef.CreateCopy(ref other._sharedBaseStorage); + _sharedBaseStorage = SharedRef.CreateCopy(in other._sharedBaseStorage); } /// @@ -90,7 +90,7 @@ namespace LibHac.Fs _offset = other._offset + offset; _size = size; _isResizable = false; - _sharedBaseStorage = SharedRef.CreateCopy(ref other._sharedBaseStorage); + _sharedBaseStorage = SharedRef.CreateCopy(in other._sharedBaseStorage); Assert.SdkRequiresLessEqual(0, offset); Assert.SdkRequiresLessEqual(0, size); @@ -105,13 +105,13 @@ namespace LibHac.Fs /// The base . /// The offset in the base storage at which to begin the created SubStorage. /// The size of the created SubStorage. - public SubStorage(ref SharedRef baseStorage, long offset, long size) + public SubStorage(in SharedRef baseStorage, long offset, long size) { BaseStorage = baseStorage.Get; _offset = offset; _size = size; _isResizable = false; - _sharedBaseStorage = SharedRef.CreateCopy(ref baseStorage); + _sharedBaseStorage = SharedRef.CreateCopy(in baseStorage); Assert.SdkRequiresNotNull(baseStorage.Get); Assert.SdkRequiresLessEqual(0, _offset); @@ -137,7 +137,7 @@ namespace LibHac.Fs _offset = other._offset; _size = other._size; _isResizable = other._isResizable; - _sharedBaseStorage.SetByCopy(ref other._sharedBaseStorage); + _sharedBaseStorage.SetByCopy(in other._sharedBaseStorage); } } diff --git a/src/LibHac/FsSrv/BaseStorageService.cs b/src/LibHac/FsSrv/BaseStorageService.cs index afcf59b3..5869ade0 100644 --- a/src/LibHac/FsSrv/BaseStorageService.cs +++ b/src/LibHac/FsSrv/BaseStorageService.cs @@ -236,7 +236,7 @@ namespace LibHac.FsSrv internal Result OpenDeviceOperator(ref SharedRef outDeviceOperator, AccessControl accessControl) { - outDeviceOperator.SetByCopy(ref _deviceOperator); + outDeviceOperator.SetByCopy(in _deviceOperator); return Result.Success; } } diff --git a/src/LibHac/FsSrv/DefaultFsServerObjects.cs b/src/LibHac/FsSrv/DefaultFsServerObjects.cs index 77619caf..a9b484f8 100644 --- a/src/LibHac/FsSrv/DefaultFsServerObjects.cs +++ b/src/LibHac/FsSrv/DefaultFsServerObjects.cs @@ -24,7 +24,7 @@ namespace LibHac.FsSrv using var sharedRootFileSystem = new SharedRef(rootFileSystem); using SharedRef sharedRootFileSystemCopy = - SharedRef.CreateCopy(ref sharedRootFileSystem.Ref()); + SharedRef.CreateCopy(in sharedRootFileSystem); creators.RomFileSystemCreator = new RomFileSystemCreator(); creators.PartitionFileSystemCreator = new PartitionFileSystemCreator(); diff --git a/src/LibHac/FsSrv/FsCreator/EmulatedBisFileSystemCreatorConfig.cs b/src/LibHac/FsSrv/FsCreator/EmulatedBisFileSystemCreatorConfig.cs index 41bc5963..e337f273 100644 --- a/src/LibHac/FsSrv/FsCreator/EmulatedBisFileSystemCreatorConfig.cs +++ b/src/LibHac/FsSrv/FsCreator/EmulatedBisFileSystemCreatorConfig.cs @@ -50,7 +50,7 @@ namespace LibHac.FsSrv.FsCreator public bool TryGetRootFileSystem(ref SharedRef outFileSystem) { - outFileSystem.SetByCopy(ref _rootFileSystem); + outFileSystem.SetByCopy(in _rootFileSystem); return outFileSystem.HasValue; } @@ -60,7 +60,7 @@ namespace LibHac.FsSrv.FsCreator if (!IsValidPartitionId(partitionId)) return false; - outFileSystem.SetByCopy(ref PartitionFileSystems[GetArrayIndex(partitionId)]); + outFileSystem.SetByCopy(in PartitionFileSystems[GetArrayIndex(partitionId)]); return outFileSystem.HasValue; } diff --git a/src/LibHac/FsSrv/FsCreator/EmulatedGameCardStorageCreator.cs b/src/LibHac/FsSrv/FsCreator/EmulatedGameCardStorageCreator.cs index 1320e171..9c3acad4 100644 --- a/src/LibHac/FsSrv/FsCreator/EmulatedGameCardStorageCreator.cs +++ b/src/LibHac/FsSrv/FsCreator/EmulatedGameCardStorageCreator.cs @@ -25,7 +25,7 @@ namespace LibHac.FsSrv.FsCreator Result rc = GameCard.GetCardInfo(out GameCardInfo cardInfo, handle); if (rc.IsFailure()) return rc; - outStorage.Reset(new SubStorage(ref baseStorage.Ref(), 0, cardInfo.SecureAreaOffset)); + outStorage.Reset(new SubStorage(in baseStorage, 0, cardInfo.SecureAreaOffset)); return Result.Success; } @@ -51,7 +51,7 @@ namespace LibHac.FsSrv.FsCreator rc = GameCard.GetCardInfo(out GameCardInfo cardInfo, handle); if (rc.IsFailure()) return rc; - outStorage.Reset(new SubStorage(ref baseStorage.Ref(), cardInfo.SecureAreaOffset, cardInfo.SecureAreaSize)); + outStorage.Reset(new SubStorage(in baseStorage, cardInfo.SecureAreaOffset, cardInfo.SecureAreaSize)); return Result.Success; } diff --git a/src/LibHac/FsSrv/FsCreator/EmulatedSdCardFileSystemCreator.cs b/src/LibHac/FsSrv/FsCreator/EmulatedSdCardFileSystemCreator.cs index 393226e5..d2d60cbc 100644 --- a/src/LibHac/FsSrv/FsCreator/EmulatedSdCardFileSystemCreator.cs +++ b/src/LibHac/FsSrv/FsCreator/EmulatedSdCardFileSystemCreator.cs @@ -44,7 +44,7 @@ namespace LibHac.FsSrv.FsCreator if (_sdCardFileSystem.HasValue) { - outFileSystem.SetByCopy(ref _sdCardFileSystem); + outFileSystem.SetByCopy(in _sdCardFileSystem); return Result.Success; } @@ -67,11 +67,11 @@ namespace LibHac.FsSrv.FsCreator // Todo: Add ProxyFileSystem? - using SharedRef fileSystem = SharedRef.CreateCopy(ref _rootFileSystem); + using SharedRef fileSystem = SharedRef.CreateCopy(in _rootFileSystem); rc = Utility.WrapSubDirectory(ref _sdCardFileSystem, ref fileSystem.Ref(), in sdCardPath, true); if (rc.IsFailure()) return rc; - outFileSystem.SetByCopy(ref _sdCardFileSystem); + outFileSystem.SetByCopy(in _sdCardFileSystem); return Result.Success; } diff --git a/src/LibHac/FsSrv/FsCreator/SaveDataFileSystemCreator.cs b/src/LibHac/FsSrv/FsCreator/SaveDataFileSystemCreator.cs index 7f294f6c..41891268 100644 --- a/src/LibHac/FsSrv/FsCreator/SaveDataFileSystemCreator.cs +++ b/src/LibHac/FsSrv/FsCreator/SaveDataFileSystemCreator.cs @@ -83,8 +83,8 @@ namespace LibHac.FsSrv.FsCreator isMultiCommitSupported, !openReadOnly); if (rc.IsFailure()) return rc; - outFileSystem.SetByCopy(ref saveDirFs.Ref()); - outExtraDataAccessor.SetByCopy(ref saveDirFs.Ref()); + outFileSystem.SetByCopy(in saveDirFs); + outExtraDataAccessor.SetByCopy(in saveDirFs); return Result.Success; } diff --git a/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs b/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs index c53863f5..8e8f464f 100644 --- a/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs +++ b/src/LibHac/FsSrv/Impl/DeepRetryFileSystem.cs @@ -23,7 +23,7 @@ namespace LibHac.FsSrv.Impl using var retryFileSystem = new SharedRef( new DeepRetryFileSystem(ref baseFileSystem, ref accessFailureManager)); - retryFileSystem.Get._selfReference = new WeakRef(ref retryFileSystem.Ref()); + retryFileSystem.Get._selfReference.Set(in retryFileSystem.Ref()); return SharedRef.CreateMove(ref retryFileSystem.Ref()); } diff --git a/src/LibHac/FsSrv/Impl/FileSystemInterfaceAdapter.cs b/src/LibHac/FsSrv/Impl/FileSystemInterfaceAdapter.cs index 66759ecb..89e86b5d 100644 --- a/src/LibHac/FsSrv/Impl/FileSystemInterfaceAdapter.cs +++ b/src/LibHac/FsSrv/Impl/FileSystemInterfaceAdapter.cs @@ -268,7 +268,7 @@ namespace LibHac.FsSrv.Impl var adapter = new FileSystemInterfaceAdapter(ref baseFileSystem, allowAllOperations); using var sharedAdapter = new SharedRef(adapter); - adapter._selfReference.Set(ref sharedAdapter.Ref()); + adapter._selfReference.Set(in sharedAdapter); return SharedRef.CreateMove(ref sharedAdapter.Ref()); } @@ -279,7 +279,7 @@ namespace LibHac.FsSrv.Impl var adapter = new FileSystemInterfaceAdapter(ref baseFileSystem, flags, allowAllOperations); using var sharedAdapter = new SharedRef(adapter); - adapter._selfReference.Set(ref sharedAdapter.Ref()); + adapter._selfReference.Set(in sharedAdapter); return SharedRef.CreateMove(ref sharedAdapter.Ref()); } @@ -498,7 +498,7 @@ namespace LibHac.FsSrv.Impl if (rc.IsFailure()) return rc; using SharedRef selfReference = - SharedRef.Create(ref _selfReference); + SharedRef.Create(in _selfReference); var adapter = new FileInterfaceAdapter(ref file.Ref(), ref selfReference.Ref(), _allowAllOperations); outFile.Reset(adapter); @@ -529,7 +529,7 @@ namespace LibHac.FsSrv.Impl if (rc.IsFailure()) return rc; using SharedRef selfReference = - SharedRef.Create(ref _selfReference); + SharedRef.Create(in _selfReference); var adapter = new DirectoryInterfaceAdapter(ref directory.Ref(), ref selfReference.Ref()); outDirectory.Reset(adapter); @@ -590,7 +590,7 @@ namespace LibHac.FsSrv.Impl public Result GetImpl(ref SharedRef fileSystem) { - fileSystem.SetByCopy(ref _baseFileSystem); + fileSystem.SetByCopy(in _baseFileSystem); return Result.Success; } } diff --git a/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs b/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs index 727e11e8..9db3f512 100644 --- a/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs +++ b/src/LibHac/FsSrv/Impl/SaveDataExtraDataAccessorCacheManager.cs @@ -12,16 +12,17 @@ namespace LibHac.FsSrv.Impl /// public class SaveDataExtraDataAccessorCacheManager : ISaveDataExtraDataAccessorCacheObserver { + [NonCopyable] private struct Cache : IDisposable { private WeakRef _accessor; private readonly SaveDataSpaceId _spaceId; private readonly ulong _saveDataId; - public Cache(ref SharedRef accessor, SaveDataSpaceId spaceId, + public Cache(in SharedRef accessor, SaveDataSpaceId spaceId, ulong saveDataId) { - _accessor = new WeakRef(ref accessor); + _accessor = new WeakRef(in accessor); _spaceId = spaceId; _saveDataId = saveDataId; } @@ -69,10 +70,10 @@ namespace LibHac.FsSrv.Impl _accessorList.Clear(); } - public Result Register(ref SharedRef accessor, SaveDataSpaceId spaceId, + public Result Register(in SharedRef accessor, SaveDataSpaceId spaceId, ulong saveDataId) { - var node = new LinkedListNode(new Cache(ref accessor, spaceId, saveDataId)); + var node = new LinkedListNode(new Cache(in accessor, spaceId, saveDataId)); using (ScopedLock.Lock(ref _mutex)) { diff --git a/src/LibHac/FsSrv/NcaFileSystemService.cs b/src/LibHac/FsSrv/NcaFileSystemService.cs index 94cc7202..05f8164f 100644 --- a/src/LibHac/FsSrv/NcaFileSystemService.cs +++ b/src/LibHac/FsSrv/NcaFileSystemService.cs @@ -43,7 +43,7 @@ namespace LibHac.FsSrv // Wrap the service in a ref-counter and give the service a weak self-reference using var sharedService = new SharedRef(ncaService); - ncaService._selfReference = new WeakRef(ref sharedService.Ref()); + ncaService._selfReference.Set(in sharedService); return SharedRef.CreateMove(ref sharedService.Ref()); } @@ -154,7 +154,7 @@ namespace LibHac.FsSrv new SharedRef(new AsynchronousAccessFileSystem(ref typeSetFileSystem.Ref())); using SharedRef accessFailureManager = - SharedRef.Create(ref _selfReference); + SharedRef.Create(in _selfReference); using SharedRef retryFileSystem = DeepRetryFileSystem.CreateShared(ref asyncFileSystem.Ref(), ref accessFailureManager.Ref()); diff --git a/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs b/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs index 52c8fee9..163167f9 100644 --- a/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs +++ b/src/LibHac/FsSrv/NcaFileSystemServiceImpl.cs @@ -145,7 +145,7 @@ namespace LibHac.FsSrv } using var nspFileSystem = new SharedRef(); - using SharedRef tempFileSystem = SharedRef.CreateCopy(ref baseFileSystem.Ref()); + using SharedRef tempFileSystem = SharedRef.CreateCopy(in baseFileSystem); rc = ParseNsp(ref currentPath, ref nspFileSystem.Ref(), ref baseFileSystem.Ref()); if (rc.IsSuccess()) diff --git a/src/LibHac/FsSrv/SaveDataFileSystemService.cs b/src/LibHac/FsSrv/SaveDataFileSystemService.cs index 21b0f0b3..83cf6fc9 100644 --- a/src/LibHac/FsSrv/SaveDataFileSystemService.cs +++ b/src/LibHac/FsSrv/SaveDataFileSystemService.cs @@ -44,10 +44,10 @@ namespace LibHac.FsSrv private HorizonClient Hos => _serviceImpl.Hos; private SharedRef GetSharedFromThis() => - SharedRef.Create(ref _selfReference); + SharedRef.Create(in _selfReference); private SharedRef GetSharedMultiCommitInterfaceFromThis() => - SharedRef.Create(ref _selfReference); + SharedRef.Create(in _selfReference); public SaveDataFileSystemService(SaveDataFileSystemServiceImpl serviceImpl, ulong processId) { @@ -64,7 +64,7 @@ namespace LibHac.FsSrv // Wrap the service in a ref-counter and give the service a weak self-reference using var sharedService = new SharedRef(saveService); - saveService._selfReference = WeakRef.Create(ref sharedService.Ref()); + saveService._selfReference.Set(in sharedService); return SharedRef.CreateMove(ref sharedService.Ref()); } @@ -1088,7 +1088,7 @@ namespace LibHac.FsSrv Result rc = TryAcquireSaveDataMountCountSemaphore(ref mountCountSemaphore.Ref()); if (rc.IsFailure()) return rc; - Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); + using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); bool useAsyncFileSystem = !_serviceImpl.IsAllowedDirectorySaveData(spaceId, in saveDataRootPath); using var fileSystem = new SharedRef(); @@ -1103,7 +1103,7 @@ namespace LibHac.FsSrv Result ReadExtraData(out SaveDataExtraData data) { - Path savePath = _saveDataRootPath.DangerousGetPath(); + using Path savePath = _saveDataRootPath.DangerousGetPath(); return _serviceImpl.ReadSaveDataFileSystemExtraData(out data, spaceId, saveDataId, type, in savePath); } @@ -1278,7 +1278,7 @@ namespace LibHac.FsSrv rc = accessor.Get.Indexer.GetKey(out SaveDataAttribute key, saveDataId); if (rc.IsFailure()) return rc; - Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); + using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); return _serviceImpl.ReadSaveDataFileSystemExtraData(out extraData, spaceId, saveDataId, key.Type, in saveDataRootPath); } @@ -1444,7 +1444,7 @@ namespace LibHac.FsSrv { using var scopedContext = new ScopedStorageLayoutTypeSetter(StorageType.NonGameCard); - Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); + using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); return _serviceImpl.WriteSaveDataFileSystemExtraData(spaceId, saveDataId, in extraData, in saveDataRootPath, saveType, updateTimeStamp); } @@ -1472,7 +1472,7 @@ namespace LibHac.FsSrv ReadExtraData); if (rc.IsFailure()) return rc; - Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); + using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); rc = _serviceImpl.ReadSaveDataFileSystemExtraData(out SaveDataExtraData extraDataModify, spaceId, saveDataId, key.Type, in saveDataRootPath); if (rc.IsFailure()) return rc; @@ -1893,7 +1893,7 @@ namespace LibHac.FsSrv Result rc = FindCacheStorage(out SaveDataInfo saveInfo, out SaveDataSpaceId spaceId, index); if (rc.IsFailure()) return rc; - Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); + using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath(); rc = _serviceImpl.ReadSaveDataFileSystemExtraData(out SaveDataExtraData extraData, spaceId, saveInfo.SaveDataId, saveInfo.Type, in saveDataRootPath); if (rc.IsFailure()) return rc; diff --git a/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs b/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs index 6cacf2c3..e381dab1 100644 --- a/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs +++ b/src/LibHac/FsSrv/SaveDataFileSystemServiceImpl.cs @@ -175,7 +175,7 @@ namespace LibHac.FsSrv { extraDataAccessor.Get.RegisterCacheObserver(_extraDataCacheManager, spaceId, saveDataId); - rc = _extraDataCacheManager.Register(ref extraDataAccessor.Ref(), spaceId, saveDataId); + rc = _extraDataCacheManager.Register(in extraDataAccessor, spaceId, saveDataId); if (rc.IsFailure()) return rc.Miss(); } } diff --git a/src/LibHac/FsSrv/SaveDataIndexer.cs b/src/LibHac/FsSrv/SaveDataIndexer.cs index 4adf9b23..fc93df61 100644 --- a/src/LibHac/FsSrv/SaveDataIndexer.cs +++ b/src/LibHac/FsSrv/SaveDataIndexer.cs @@ -521,7 +521,7 @@ namespace LibHac.FsSrv rc = RegisterReader(ref reader.Ref()); if (rc.IsFailure()) return rc; - outInfoReader.SetByCopy(ref reader.Ref()); + outInfoReader.SetByCopy(in reader.Ref()); return Result.Success; } } @@ -785,7 +785,7 @@ namespace LibHac.FsSrv public ReaderAccessor(ref SharedRef reader) { - _reader = new WeakRef(ref reader); + _reader = new WeakRef(in reader); } public void Dispose() => _reader.Destroy(); diff --git a/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs b/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs index 19d673f5..13426e30 100644 --- a/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs +++ b/src/LibHac/FsSrv/SaveDataSharedFileStorage.cs @@ -271,6 +271,7 @@ namespace LibHac.FsSrv /// Based on FS 12.1.0 (nnSdk 12.3.1). public class SaveDataFileStorageHolder { + [NonCopyable] private struct Entry { private SharedRef _storage; @@ -297,7 +298,7 @@ namespace LibHac.FsSrv public SharedRef GetStorage() { - return SharedRef.CreateCopy(ref _storage); + return SharedRef.CreateCopy(in _storage); } } @@ -370,7 +371,7 @@ namespace LibHac.FsSrv if (rc.IsFailure()) return rc; using SharedRef baseFileStorageCopy = - SharedRef.CreateCopy(ref baseFileStorage.Ref()); + SharedRef.CreateCopy(in baseFileStorage); rc = Register(ref baseFileStorageCopy.Ref(), spaceId, saveDataId); if (rc.IsFailure()) return rc; diff --git a/src/LibHac/FsSystem/SaveDataFileSystemCacheManager.cs b/src/LibHac/FsSystem/SaveDataFileSystemCacheManager.cs index 6734089a..40fcf9c5 100644 --- a/src/LibHac/FsSystem/SaveDataFileSystemCacheManager.cs +++ b/src/LibHac/FsSystem/SaveDataFileSystemCacheManager.cs @@ -7,6 +7,7 @@ namespace LibHac.FsSystem { public class SaveDataFileSystemCacheManager : ISaveDataFileSystemCacheManager { + [NonCopyable] private struct Cache { // Note: Nintendo only supports caching SaveDataFileSystem. We support DirectorySaveDataFileSystem too, diff --git a/src/LibHac/FsSystem/StorageExtensions.cs b/src/LibHac/FsSystem/StorageExtensions.cs index adcc4847..6cb0d58e 100644 --- a/src/LibHac/FsSystem/StorageExtensions.cs +++ b/src/LibHac/FsSystem/StorageExtensions.cs @@ -62,7 +62,7 @@ namespace LibHac.FsSystem using (var sharedStorage = new SharedRef(storage)) { - return new SubStorage(ref sharedStorage.Ref(), start, length); + return new SubStorage(in sharedStorage, start, length); } } diff --git a/src/hactoolnet/ProcessPackage.cs b/src/hactoolnet/ProcessPackage.cs index a820a9ad..ceefaff4 100644 --- a/src/hactoolnet/ProcessPackage.cs +++ b/src/hactoolnet/ProcessPackage.cs @@ -15,10 +15,10 @@ namespace hactoolnet { public static void ProcessPk11(Context ctx) { - using (var file = new LocalStorage(ctx.Options.InFile, FileAccess.Read)) + using (var file = new SharedRef(new LocalStorage(ctx.Options.InFile, FileAccess.Read))) { var package1 = new LibHac.Boot.Package1(); - package1.Initialize(ctx.KeySet, file).ThrowIfFailure(); + package1.Initialize(ctx.KeySet, in file).ThrowIfFailure(); ctx.Logger.LogMessage(package1.Print()); diff --git a/tests/LibHac.Tests/Fs/DirectorySaveDataFileSystemTests.cs b/tests/LibHac.Tests/Fs/DirectorySaveDataFileSystemTests.cs index f69ac8c1..9b4d5039 100644 --- a/tests/LibHac.Tests/Fs/DirectorySaveDataFileSystemTests.cs +++ b/tests/LibHac.Tests/Fs/DirectorySaveDataFileSystemTests.cs @@ -443,11 +443,8 @@ namespace LibHac.Tests.Fs rc = fileSystem.OpenFile(ref file.Ref(), path, OpenMode.ReadWrite); if (rc.IsFailure()) return rc; - using (file) - { - rc = file.Get.Write(0, SpanHelpers.AsByteSpan(ref extraData), WriteOption.Flush); - if (rc.IsFailure()) return rc; - } + rc = file.Get.Write(0, SpanHelpers.AsByteSpan(ref extraData), WriteOption.Flush); + if (rc.IsFailure()) return rc; return Result.Success; }