From a9fd9221b764a465712e5fd1a7152d24dfd083c4 Mon Sep 17 00:00:00 2001 From: Jamie Reece Wilson Date: Sat, 9 Mar 2024 00:56:59 +0000 Subject: [PATCH] [+] AuFS::OpenAsyncFromSharedHandle --- Include/Aurora/IO/FS/Async.hpp | 12 ++++-------- Source/IO/FS/Async.Linux.cpp | 23 ++++++++++++++++++++++- Source/IO/FS/Async.NT.cpp | 25 +++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Include/Aurora/IO/FS/Async.hpp b/Include/Aurora/IO/FS/Async.hpp index 003a3589..022da456 100644 --- a/Include/Aurora/IO/FS/Async.hpp +++ b/Include/Aurora/IO/FS/Async.hpp @@ -12,13 +12,9 @@ namespace Aurora::IO::FS AUKN_SHARED_API(OpenAsync, IAsyncFileStream, const AuString &path, EFileOpenMode openMode, - bool bDirectIO = true, // true disables buffering under Win32 - // true enables non-blocking ticks under Linux aio by bypassing the kernels cache - EFileAdvisoryLockLevel lock = EFileAdvisoryLockLevel::eNoSafety); + AuOptional optbDirectIO = { true }, + AuOptional optLock = { EFileAdvisoryLockLevel::eNoSafety }); -#if defined(AUX_FSAOPEX) - AUKN_SYM AuSPtr OpenDirectIOAsyncFileStreamFromHandle(AuSPtr pIOHandle); - - AUKN_SYM AuSPtr OpenBufferedAsyncFileStreamFromHandle(AuSPtr pIOHandle); -#endif + AUKN_SHARED_API(OpenAsyncFromSharedHandle, IAsyncFileStream, + const AuSPtr &pIOHandle); } \ No newline at end of file diff --git a/Source/IO/FS/Async.Linux.cpp b/Source/IO/FS/Async.Linux.cpp index 089416a3..dd01b784 100644 --- a/Source/IO/FS/Async.Linux.cpp +++ b/Source/IO/FS/Async.Linux.cpp @@ -611,8 +611,11 @@ namespace Aurora::IO::FS } } - AUKN_SYM IAsyncFileStream *OpenAsyncNew(const AuString &path, EFileOpenMode openMode, bool bDirectIO, EFileAdvisoryLockLevel lock) + AUKN_SYM IAsyncFileStream *OpenAsyncNew(const AuString &path, EFileOpenMode openMode, AuOptional optbDirectIO, AuOptional optLock) { + auto bDirectIO = optbDirectIO.ValueOr(true); + auto lock = optLock.ValueOr(EFileAdvisoryLockLevel::eNoSafety); + auto pHandle = AuIO::IOHandleShared(); if (!pHandle) { @@ -648,4 +651,22 @@ namespace Aurora::IO::FS { AuSafeDelete(handle); } + + AUKN_SYM IAsyncFileStream *OpenAsyncFromSharedHandleNew(const AuSPtr &pIOHandle) + { + auto pStream = _new LinuxAsyncFileStream(); + if (!pStream) + { + SysPushErrorMemory(); + return nullptr; + } + + pStream->Init(pIOHandle); + return pStream; + } + + AUKN_SYM void OpenAsyncFromSharedHandleRelease(IAsyncFileStream *handle) + { + AuSafeDelete(handle); + } } \ No newline at end of file diff --git a/Source/IO/FS/Async.NT.cpp b/Source/IO/FS/Async.NT.cpp index 52bdbb38..4c12c909 100644 --- a/Source/IO/FS/Async.NT.cpp +++ b/Source/IO/FS/Async.NT.cpp @@ -667,8 +667,11 @@ namespace Aurora::IO::FS } } - AUKN_SYM IAsyncFileStream *OpenAsyncNew(const AuString &path, EFileOpenMode openMode, bool directIO, EFileAdvisoryLockLevel lock) + AUKN_SYM IAsyncFileStream *OpenAsyncNew(const AuString &path, EFileOpenMode openMode, AuOptional optbDirectIO, AuOptional optLock) { + auto bDirectIO = optbDirectIO.ValueOr(true); + auto lock = optLock.ValueOr(EFileAdvisoryLockLevel::eNoSafety); + auto pHandle = AuIO::IOHandleShared(); if (!pHandle) { @@ -680,7 +683,7 @@ namespace Aurora::IO::FS createhandle.eAdvisoryLevel = lock; createhandle.eMode = openMode; createhandle.bFailIfNonEmptyFile = false; - createhandle.bDirectIOMode = directIO; + createhandle.bDirectIOMode = bDirectIO; createhandle.bAsyncHandle = true; if (!pHandle->InitFromPath(createhandle)) @@ -704,4 +707,22 @@ namespace Aurora::IO::FS { AuSafeDelete(handle); } + + AUKN_SYM IAsyncFileStream *OpenAsyncFromSharedHandleNew(const AuSPtr &pIOHandle) + { + auto pStream = _new NtAsyncFileStream(); + if (!pStream) + { + SysPushErrorMemory(); + return nullptr; + } + + pStream->Init(pIOHandle); + return pStream; + } + + AUKN_SYM void OpenAsyncFromSharedHandleRelease(IAsyncFileStream *handle) + { + AuSafeDelete(handle); + } } \ No newline at end of file