[+] IFileStream::IsFlushOnClose
[+] IFileStream::SetFlushOnClose [+] IFileStream::IsWriteEoSOnClose [+] IFileStream::SetWriteEoSOnClose [+] IIOHandle::IsFlushOnClose [+] IIOHandle::SetFlushOnClose
This commit is contained in:
parent
c16a0b1600
commit
63050b2262
@ -64,6 +64,30 @@ namespace Aurora::IO::FS
|
||||
*/
|
||||
virtual void MakeTemporary() = 0;
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* @return
|
||||
*/
|
||||
virtual bool IsFlushOnClose() const = 0;
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* @param bFlushOnClose
|
||||
*/
|
||||
virtual void SetFlushOnClose(bool bFlushOnClose) = 0;
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* @return
|
||||
*/
|
||||
virtual bool IsWriteEoSOnClose() const = 0;
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* @param bFlushOnClose
|
||||
*/
|
||||
virtual void SetWriteEoSOnClose(bool bShouldWriteEoS) = 0;
|
||||
|
||||
/**
|
||||
* @brief Returns the IO handle backing the file stream, if available.
|
||||
*/
|
||||
|
@ -131,6 +131,10 @@ namespace Aurora::IO
|
||||
|
||||
virtual AuString GetPath() const = 0;
|
||||
|
||||
virtual bool IsFlushOnClose() const = 0;
|
||||
|
||||
virtual void SetFlushOnClose(bool bFlushOnClose) = 0;
|
||||
|
||||
virtual bool IsFile() const = 0;
|
||||
|
||||
virtual bool IsTTY() const = 0;
|
||||
|
@ -35,7 +35,7 @@ namespace Aurora::Grug
|
||||
static AuConditionVariable gCondVar(AuUnsafeRaiiToShared(gMutex.AsPointer())); // slow logger work queue
|
||||
static AuSemaphore gArrows;
|
||||
static AuMutex gOtherMutex;
|
||||
static AuList<AuUInt> gHandlesToClose;
|
||||
static AuList<AuPair<AuUInt, bool>> gHandlesToClose;
|
||||
static AuList<AuThreadPrimitives::IEvent *> gEventsToTrigger;
|
||||
|
||||
static void SlowStartupTasks()
|
||||
@ -210,13 +210,24 @@ namespace Aurora::Grug
|
||||
toTrigger = AuMove(gEventsToTrigger);
|
||||
}
|
||||
|
||||
for (const auto uHandle : toClose)
|
||||
for (const auto [uHandle, bFlush] : toClose)
|
||||
{
|
||||
#if defined(AURORA_IS_MODERNNT_DERIVED)
|
||||
auto pHandle = (void *)uHandle;
|
||||
if (bFlush && pHandle)
|
||||
{
|
||||
if (AuIO::IsHandleFile(uHandle))
|
||||
{
|
||||
FlushFileBuffers(pHandle);
|
||||
}
|
||||
}
|
||||
AuWin32CloseHandle(pHandle);
|
||||
#elif defined(AURORA_IS_POSIX_DERIVED)
|
||||
close(uHandle);
|
||||
if (bFlush)
|
||||
{
|
||||
::fsync(uHandle);
|
||||
}
|
||||
::close(uHandle);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -234,12 +245,12 @@ namespace Aurora::Grug
|
||||
GrugDoIoWork();
|
||||
}
|
||||
|
||||
void CloseHandle(AuUInt64 handle)
|
||||
void CloseHandle(AuUInt64 handle, bool bFlush)
|
||||
{
|
||||
{
|
||||
AU_DEBUG_MEMCRUNCH;
|
||||
AU_LOCK_GUARD(gOtherMutex);
|
||||
gHandlesToClose.push_back(handle);
|
||||
gHandlesToClose.push_back(AuMakePair(AuUInt(handle), bFlush));
|
||||
}
|
||||
|
||||
NotifyGrugOfTelemetry();
|
||||
|
@ -24,6 +24,6 @@ namespace Aurora::Grug
|
||||
void InitGrug();
|
||||
void DeinitGrug();
|
||||
|
||||
void CloseHandle(AuUInt64 handle);
|
||||
void CloseHandle(AuUInt64 handle, bool bFlush = false);
|
||||
void WaitForGrugTick();
|
||||
}
|
@ -40,13 +40,13 @@ namespace Aurora::IO
|
||||
return AuUInt64(hHandle);
|
||||
}
|
||||
|
||||
void AFileHandle::CloseHandle(AuUInt64 uOSHandle)
|
||||
void AFileHandle::CloseHandle(AuUInt64 uOSHandle, bool bFlushOnClose)
|
||||
{
|
||||
#if 0
|
||||
HANDLE hHandle = (HANDLE)uOSHandle;
|
||||
AuWin32CloseHandle(hHandle);
|
||||
#else
|
||||
Grug::CloseHandle(uOSHandle);
|
||||
Grug::CloseHandle(uOSHandle, bFlushOnClose);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -85,7 +85,7 @@ namespace Aurora::IO
|
||||
return 1;
|
||||
}
|
||||
|
||||
void AFileHandle::CloseHandle(AuUInt64 uOSHandle)
|
||||
void AFileHandle::CloseHandle(AuUInt64 uOSHandle, bool bFlushOnClose)
|
||||
{
|
||||
int fd = (int)uOSHandle;
|
||||
if (fd < 0)
|
||||
@ -94,9 +94,13 @@ namespace Aurora::IO
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (bFlushOnClose)
|
||||
{
|
||||
::fsync(uOSHandle);
|
||||
}
|
||||
::close(fd);
|
||||
#else
|
||||
Grug::CloseHandle(uOSHandle);
|
||||
Grug::CloseHandle(uOSHandle, bFlushOnClose);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -181,7 +185,12 @@ namespace Aurora::IO
|
||||
|
||||
flags |= create.eMode == FS::EFileOpenMode::eRead ? O_RDONLY : (O_RDWR | O_CREAT);
|
||||
flags |= O_CLOEXEC;
|
||||
|
||||
#if defined(O_DIRECT)
|
||||
flags |= this->bDirectIO ? O_DIRECT : 0;
|
||||
#else
|
||||
// TBD
|
||||
#endif
|
||||
|
||||
iFileDescriptor = ::open(pathex.c_str(),
|
||||
flags,
|
||||
|
@ -196,6 +196,16 @@ namespace Aurora::IO
|
||||
return bIsTTY;
|
||||
}
|
||||
|
||||
bool AFileHandle::IsFlushOnClose() const
|
||||
{
|
||||
return this->bFlushOnClose;
|
||||
}
|
||||
|
||||
void AFileHandle::SetFlushOnClose(bool bFlushOnClose)
|
||||
{
|
||||
this->bFlushOnClose = bFlushOnClose;
|
||||
}
|
||||
|
||||
bool AFileHandle::IsPipe() const
|
||||
{
|
||||
bool bIsPipe {};
|
||||
|
@ -58,6 +58,9 @@ namespace Aurora::IO
|
||||
bool IsTTY() const override;
|
||||
bool IsPipe() const override;
|
||||
|
||||
bool IsFlushOnClose() const override;
|
||||
void SetFlushOnClose(bool bFlushOnClose) override;
|
||||
|
||||
void InitStdIn(bool bSharing = false);
|
||||
void InitStdOut(bool bError = false, bool bSharing = false);
|
||||
|
||||
@ -71,7 +74,7 @@ namespace Aurora::IO
|
||||
AuOptionalEx<AuUInt64> uOSWriteHandle;
|
||||
AuOptionalEx<AuUInt64> uOSReadHandle;
|
||||
AuSPtr<IIOHandle> pThat;
|
||||
bool bIsAsync {};
|
||||
bool bIsAsync {}, bFlushOnClose {};
|
||||
AuString path;
|
||||
IPC::IPCPipeImpl *pIPCPipe {};
|
||||
bool bDirectIO {};
|
||||
@ -86,6 +89,11 @@ namespace Aurora::IO
|
||||
|
||||
static AuUInt64 DupHandle(AuUInt64 uOSHandle, bool bWriteAccess);
|
||||
static AuUInt64 DupHandle(AuUInt64 uOSHandle, bool bWriteAccess, bool bShareAccess);
|
||||
static void CloseHandle(AuUInt64 uOSHandle);
|
||||
static void CloseHandle(AuUInt64 uOSHandle, bool bFlushOnClose);
|
||||
|
||||
inline void CloseHandle(AuUInt64 uOSHandle)
|
||||
{
|
||||
CloseHandle(uOSHandle, this->bFlushOnClose);
|
||||
}
|
||||
};
|
||||
}
|
@ -390,6 +390,11 @@ namespace Aurora::IO::FS
|
||||
bool bDeleteFailed {};
|
||||
AuString path;
|
||||
|
||||
if (this->bShouldWriteEoS)
|
||||
{
|
||||
this->WriteEoS();
|
||||
}
|
||||
|
||||
if ((hHandle != INVALID_HANDLE_VALUE) &&
|
||||
(this->bShouldDelete))
|
||||
{
|
||||
@ -434,6 +439,36 @@ namespace Aurora::IO::FS
|
||||
this->bShouldDelete = true;
|
||||
}
|
||||
|
||||
bool WinFileStream::IsFlushOnClose() const
|
||||
{
|
||||
if (auto pHandle = this->pHandle_)
|
||||
{
|
||||
return pHandle->IsFlushOnClose();
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void WinFileStream::SetFlushOnClose(bool bFlushOnClose)
|
||||
{
|
||||
if (auto pHandle = this->pHandle_)
|
||||
{
|
||||
pHandle->SetFlushOnClose(bFlushOnClose);
|
||||
}
|
||||
}
|
||||
|
||||
bool WinFileStream::IsWriteEoSOnClose() const
|
||||
{
|
||||
return this->bShouldWriteEoS;
|
||||
}
|
||||
|
||||
void WinFileStream::SetWriteEoSOnClose(bool bShouldWriteEoS)
|
||||
{
|
||||
this->bShouldWriteEoS = bShouldWriteEoS;
|
||||
}
|
||||
|
||||
AuSPtr<IIOHandle> WinFileStream::GetHandle()
|
||||
{
|
||||
return this->pHandle_;
|
||||
|
@ -28,6 +28,10 @@ namespace Aurora::IO::FS
|
||||
void WriteEoS() override;
|
||||
void MakeTemporary() override;
|
||||
AuSPtr<IIOHandle> GetHandle() override;
|
||||
bool IsFlushOnClose() const override;
|
||||
void SetFlushOnClose(bool bFlushOnClose) override;
|
||||
bool IsWriteEoSOnClose() const override;
|
||||
void SetWriteEoSOnClose(bool bFlushOnClose) override;
|
||||
IO::IStreamReader *ToStreamReader() override;
|
||||
IO::IStreamWriter *ToStreamWriter() override;
|
||||
|
||||
@ -35,7 +39,7 @@ namespace Aurora::IO::FS
|
||||
|
||||
private:
|
||||
AuSPtr<IIOHandle> pHandle_;
|
||||
bool bShouldDelete {};
|
||||
bool bShouldDelete {}, bShouldWriteEoS {};
|
||||
HANDLE hEventHandle_ { INVALID_HANDLE_VALUE };
|
||||
AuFS::FileReader reader_;
|
||||
AuFS::FileWriter writer_;
|
||||
|
@ -360,6 +360,11 @@ namespace Aurora::IO::FS
|
||||
auto pHandle = this->pHandle_;
|
||||
AuResetMember(this->pHandle_);
|
||||
|
||||
if (this->bShouldWriteEoS)
|
||||
{
|
||||
this->WriteEoS();
|
||||
}
|
||||
|
||||
if (AuExchange(this->bMadeTemporary, false))
|
||||
{
|
||||
if (pHandle)
|
||||
@ -369,6 +374,36 @@ namespace Aurora::IO::FS
|
||||
}
|
||||
}
|
||||
|
||||
bool PosixFileStream::IsFlushOnClose() const
|
||||
{
|
||||
if (auto pHandle = this->pHandle_)
|
||||
{
|
||||
return pHandle->IsFlushOnClose();
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void PosixFileStream::SetFlushOnClose(bool bFlushOnClose)
|
||||
{
|
||||
if (auto pHandle = this->pHandle_)
|
||||
{
|
||||
pHandle->SetFlushOnClose(bFlushOnClose);
|
||||
}
|
||||
}
|
||||
|
||||
bool PosixFileStream::IsWriteEoSOnClose() const
|
||||
{
|
||||
return this->bShouldWriteEoS;
|
||||
}
|
||||
|
||||
void PosixFileStream::SetWriteEoSOnClose(bool bShouldWriteEoS)
|
||||
{
|
||||
this->bShouldWriteEoS = bShouldWriteEoS;
|
||||
}
|
||||
|
||||
void PosixFileStream::Flush()
|
||||
{
|
||||
if (!this->pHandle_)
|
||||
|
@ -33,6 +33,10 @@ namespace Aurora::IO::FS
|
||||
void Flush() override;
|
||||
void WriteEoS() override;
|
||||
void MakeTemporary() override;
|
||||
bool IsFlushOnClose() const override;
|
||||
void SetFlushOnClose(bool bFlushOnClose) override;
|
||||
bool IsWriteEoSOnClose() const override;
|
||||
void SetWriteEoSOnClose(bool bFlushOnClose) override;
|
||||
AuSPtr<IIOHandle> GetHandle() override;
|
||||
IO::IStreamReader *ToStreamReader() override;
|
||||
IO::IStreamWriter *ToStreamWriter() override;
|
||||
@ -42,7 +46,7 @@ namespace Aurora::IO::FS
|
||||
AuSPtr<IIOHandle> pHandle_;
|
||||
AuString path_;
|
||||
AuThreadPrimitives::SpinLock spinlock_;
|
||||
bool bMadeTemporary {};
|
||||
bool bMadeTemporary {}, bShouldWriteEoS {};
|
||||
AuFS::FileReader reader_;
|
||||
AuFS::FileWriter writer_;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user