mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Make FileHandle and DirectoryHandle implement IDisposable
This commit is contained in:
parent
646055de5a
commit
880916e117
4 changed files with 38 additions and 17 deletions
|
@ -1,4 +1,6 @@
|
||||||
namespace LibHac.Fs
|
using LibHac.Fs.Fsa;
|
||||||
|
|
||||||
|
namespace LibHac.Fs
|
||||||
{
|
{
|
||||||
public readonly struct DirectoryHandle
|
public readonly struct DirectoryHandle
|
||||||
{
|
{
|
||||||
|
@ -10,5 +12,13 @@
|
||||||
{
|
{
|
||||||
Directory = directory;
|
Directory = directory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (IsValid)
|
||||||
|
{
|
||||||
|
Directory.GetParent().FsClient.CloseDirectory(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,9 @@
|
||||||
namespace LibHac.Fs
|
using System;
|
||||||
|
using LibHac.Fs.Fsa;
|
||||||
|
|
||||||
|
namespace LibHac.Fs
|
||||||
{
|
{
|
||||||
public readonly struct FileHandle
|
public readonly struct FileHandle : IDisposable
|
||||||
{
|
{
|
||||||
internal readonly Impl.FileAccessor File;
|
internal readonly Impl.FileAccessor File;
|
||||||
|
|
||||||
|
@ -10,5 +13,13 @@
|
||||||
{
|
{
|
||||||
File = file;
|
File = file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (IsValid)
|
||||||
|
{
|
||||||
|
File.FsClient.CloseFile(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,12 @@ namespace LibHac.Fs.Impl
|
||||||
// ReSharper disable once NotAccessedField.Local
|
// ReSharper disable once NotAccessedField.Local
|
||||||
private int _pathHashIndex;
|
private int _pathHashIndex;
|
||||||
|
|
||||||
private FileSystemClient _fsClient;
|
internal FileSystemClient FsClient { get; }
|
||||||
|
|
||||||
public FileAccessor(FileSystemClient fsClient, ref IFile file, FileSystemAccessor parentFileSystem,
|
public FileAccessor(FileSystemClient fsClient, ref IFile file, FileSystemAccessor parentFileSystem,
|
||||||
OpenMode mode)
|
OpenMode mode)
|
||||||
{
|
{
|
||||||
_fsClient = fsClient;
|
FsClient = fsClient;
|
||||||
|
|
||||||
_file = Shared.Move(ref file);
|
_file = Shared.Move(ref file);
|
||||||
_parentFileSystem = parentFileSystem;
|
_parentFileSystem = parentFileSystem;
|
||||||
|
@ -91,18 +91,18 @@ namespace LibHac.Fs.Impl
|
||||||
|
|
||||||
if (_lastResult.IsFailure())
|
if (_lastResult.IsFailure())
|
||||||
{
|
{
|
||||||
if (_fsClient.Impl.IsEnabledAccessLog() && _fsClient.Impl.IsEnabledHandleAccessLog(handle))
|
if (FsClient.Impl.IsEnabledAccessLog() && FsClient.Impl.IsEnabledHandleAccessLog(handle))
|
||||||
{
|
{
|
||||||
Tick start = _fsClient.Hos.Os.GetSystemTick();
|
Tick start = FsClient.Hos.Os.GetSystemTick();
|
||||||
rc = _lastResult;
|
rc = _lastResult;
|
||||||
Tick end = _fsClient.Hos.Os.GetSystemTick();
|
Tick end = FsClient.Hos.Os.GetSystemTick();
|
||||||
|
|
||||||
var sb = new U8StringBuilder(logBuffer, true);
|
var sb = new U8StringBuilder(logBuffer, true);
|
||||||
sb.Append(LogOffset).AppendFormat(offset)
|
sb.Append(LogOffset).AppendFormat(offset)
|
||||||
.Append(LogSize).AppendFormat(destination.Length)
|
.Append(LogSize).AppendFormat(destination.Length)
|
||||||
.Append(LogReadSize).AppendFormat(AccessLogImpl.DereferenceOutValue(in bytesRead, rc));
|
.Append(LogReadSize).AppendFormat(AccessLogImpl.DereferenceOutValue(in bytesRead, rc));
|
||||||
|
|
||||||
_fsClient.Impl.OutputAccessLog(rc, start, end, handle, new U8Span(logBuffer),
|
FsClient.Impl.OutputAccessLog(rc, start, end, handle, new U8Span(logBuffer),
|
||||||
nameof(UserFile.ReadFile));
|
nameof(UserFile.ReadFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,18 +123,18 @@ namespace LibHac.Fs.Impl
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_fsClient.Impl.IsEnabledAccessLog() && _fsClient.Impl.IsEnabledHandleAccessLog(handle))
|
if (FsClient.Impl.IsEnabledAccessLog() && FsClient.Impl.IsEnabledHandleAccessLog(handle))
|
||||||
{
|
{
|
||||||
Tick start = _fsClient.Hos.Os.GetSystemTick();
|
Tick start = FsClient.Hos.Os.GetSystemTick();
|
||||||
rc = ReadWithoutCacheAccessLog(out bytesRead, offset, destination, in option);
|
rc = ReadWithoutCacheAccessLog(out bytesRead, offset, destination, in option);
|
||||||
Tick end = _fsClient.Hos.Os.GetSystemTick();
|
Tick end = FsClient.Hos.Os.GetSystemTick();
|
||||||
|
|
||||||
var sb = new U8StringBuilder(logBuffer, true);
|
var sb = new U8StringBuilder(logBuffer, true);
|
||||||
sb.Append(LogOffset).AppendFormat(offset)
|
sb.Append(LogOffset).AppendFormat(offset)
|
||||||
.Append(LogSize).AppendFormat(destination.Length)
|
.Append(LogSize).AppendFormat(destination.Length)
|
||||||
.Append(LogReadSize).AppendFormat(AccessLogImpl.DereferenceOutValue(in bytesRead, rc));
|
.Append(LogReadSize).AppendFormat(AccessLogImpl.DereferenceOutValue(in bytesRead, rc));
|
||||||
|
|
||||||
_fsClient.Impl.OutputAccessLog(rc, start, end, handle, new U8Span(logBuffer),
|
FsClient.Impl.OutputAccessLog(rc, start, end, handle, new U8Span(logBuffer),
|
||||||
nameof(UserFile.ReadFile));
|
nameof(UserFile.ReadFile));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -25,13 +25,13 @@ namespace LibHac.Fs.Impl
|
||||||
private bool _isPathCacheAttached;
|
private bool _isPathCacheAttached;
|
||||||
private IMultiCommitTarget _multiCommitTarget;
|
private IMultiCommitTarget _multiCommitTarget;
|
||||||
|
|
||||||
private FileSystemClient _fsClient;
|
internal FileSystemClient FsClient { get; }
|
||||||
|
|
||||||
public FileSystemAccessor(FileSystemClient fsClient, U8Span name, IMultiCommitTarget multiCommitTarget,
|
public FileSystemAccessor(FileSystemClient fsClient, U8Span name, IMultiCommitTarget multiCommitTarget,
|
||||||
IFileSystem fileSystem, ICommonMountNameGenerator mountNameGenerator,
|
IFileSystem fileSystem, ICommonMountNameGenerator mountNameGenerator,
|
||||||
ISaveDataAttributeGetter saveAttributeGetter)
|
ISaveDataAttributeGetter saveAttributeGetter)
|
||||||
{
|
{
|
||||||
_fsClient = fsClient;
|
FsClient = fsClient;
|
||||||
|
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
_openFiles = new LinkedList<FileAccessor>();
|
_openFiles = new LinkedList<FileAccessor>();
|
||||||
|
@ -274,7 +274,7 @@ namespace LibHac.Fs.Impl
|
||||||
rc = _fileSystem.OpenFile(out iFile, path, mode);
|
rc = _fileSystem.OpenFile(out iFile, path, mode);
|
||||||
if (rc.IsFailure()) return rc;
|
if (rc.IsFailure()) return rc;
|
||||||
|
|
||||||
var fileAccessor = new FileAccessor(_fsClient, ref iFile, this, mode);
|
var fileAccessor = new FileAccessor(FsClient, ref iFile, this, mode);
|
||||||
|
|
||||||
using (ScopedLock.Lock(ref _openListLock))
|
using (ScopedLock.Lock(ref _openListLock))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue