[*] Linux runtime regressions
This commit is contained in:
parent
2a5fad9d0c
commit
2163a58892
@ -66,7 +66,7 @@ namespace Aurora::Async
|
|||||||
return AU_SHARED_FROM_THIS;
|
return AU_SHARED_FROM_THIS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AuTryInsert(this->waitOn_, workItem))
|
if (!AuTryInsert(this->waitOn_, AuConstReference(workItem)))
|
||||||
{
|
{
|
||||||
AuTryRemove(dependency->waiters_, AuSharedFromThis());
|
AuTryRemove(dependency->waiters_, AuSharedFromThis());
|
||||||
Fail();
|
Fail();
|
||||||
@ -100,7 +100,7 @@ namespace Aurora::Async
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AuTryInsert(this->waitOn_, workItem))
|
if (!AuTryInsert(this->waitOn_, AuConstReference(workItem)))
|
||||||
{
|
{
|
||||||
AuTryRemove(dependency->waiters_, AuSharedFromThis());
|
AuTryRemove(dependency->waiters_, AuSharedFromThis());
|
||||||
return false;
|
return false;
|
||||||
|
@ -134,6 +134,10 @@ namespace Aurora::IO
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -268,8 +268,7 @@ namespace Aurora::IO::FS
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
this->pHandle_ = handle;
|
this->pHandle_ = handle;
|
||||||
this->loopSource_ = AuMakeShared<LinuxAsyncFileTransactionLoopSource>(AuSharedFromThis());
|
return true;//bool(this->loopSource_);
|
||||||
return bool(this->loopSource_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LinuxAsyncFileTransaction::SetBaseOffset(AuUInt64 uBaseOffset)
|
void LinuxAsyncFileTransaction::SetBaseOffset(AuUInt64 uBaseOffset)
|
||||||
@ -285,6 +284,11 @@ namespace Aurora::IO::FS
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this->pHandle_)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
auto iOptSafe = this->pHandle_->GetOSReadHandleSafe();
|
auto iOptSafe = this->pHandle_->GetOSReadHandleSafe();
|
||||||
if (!iOptSafe)
|
if (!iOptSafe)
|
||||||
{
|
{
|
||||||
@ -303,13 +307,21 @@ namespace Aurora::IO::FS
|
|||||||
this->bTxFinished_ = false;
|
this->bTxFinished_ = false;
|
||||||
this->lastFinishedStat_ = 0;
|
this->lastFinishedStat_ = 0;
|
||||||
|
|
||||||
if (!this->loopSource_)
|
if (!this->pCompletionGroup_ && !this->loopSource_)
|
||||||
|
{
|
||||||
|
this->loopSource_ = AuMakeShared<LinuxAsyncFileTransactionLoopSource>(AuSharedFromThis());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this->pCompletionGroup_ && !this->loopSource_)
|
||||||
{
|
{
|
||||||
SysPushErrorUninitialized();
|
SysPushErrorUninitialized();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->loopSource_->Reset();
|
if (this->loopSource_)
|
||||||
|
{
|
||||||
|
this->loopSource_->Reset();
|
||||||
|
}
|
||||||
|
|
||||||
this->lastAbstractOffset_ = offset;
|
this->lastAbstractOffset_ = offset;
|
||||||
|
|
||||||
@ -334,7 +346,7 @@ namespace Aurora::IO::FS
|
|||||||
|
|
||||||
offset += this->uBaseOffset;
|
offset += this->uBaseOffset;
|
||||||
|
|
||||||
if (!UNIX::LinuxOverlappedSubmitRead(fd, offset, this, this->loopSource_.get(), bool(IPC_PIPE)))
|
if (!UNIX::LinuxOverlappedSubmitRead(fd, offset, this, this->pCompletionGroup_ ? this->pAltEvent : this->loopSource_.get(), bool(IPC_PIPE)))
|
||||||
{
|
{
|
||||||
LIOS_SendProcess(0, true, errno);
|
LIOS_SendProcess(0, true, errno);
|
||||||
return true;
|
return true;
|
||||||
@ -358,6 +370,11 @@ namespace Aurora::IO::FS
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this->pHandle_)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
auto iOptSafe = this->pHandle_->GetOSWriteHandleSafe();
|
auto iOptSafe = this->pHandle_->GetOSWriteHandleSafe();
|
||||||
if (!iOptSafe)
|
if (!iOptSafe)
|
||||||
{
|
{
|
||||||
@ -376,13 +393,21 @@ namespace Aurora::IO::FS
|
|||||||
this->hasError_ = false;
|
this->hasError_ = false;
|
||||||
this->lastFinishedStat_ = 0;
|
this->lastFinishedStat_ = 0;
|
||||||
|
|
||||||
if (!this->loopSource_)
|
if (!this->pCompletionGroup_ && !this->loopSource_)
|
||||||
|
{
|
||||||
|
this->loopSource_ = AuMakeShared<LinuxAsyncFileTransactionLoopSource>(AuSharedFromThis());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this->pCompletionGroup_ && !this->loopSource_)
|
||||||
{
|
{
|
||||||
SysPushErrorUninitialized();
|
SysPushErrorUninitialized();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->loopSource_->Reset();
|
if (this->loopSource_)
|
||||||
|
{
|
||||||
|
this->loopSource_->Reset();
|
||||||
|
}
|
||||||
|
|
||||||
this->lastAbstractOffset_ = offset;
|
this->lastAbstractOffset_ = offset;
|
||||||
|
|
||||||
@ -398,7 +423,7 @@ namespace Aurora::IO::FS
|
|||||||
|
|
||||||
offset += this->uBaseOffset;
|
offset += this->uBaseOffset;
|
||||||
|
|
||||||
if (!UNIX::LinuxOverlappedSubmitWrite(fd, offset, this, this->loopSource_.get()))
|
if (!UNIX::LinuxOverlappedSubmitWrite(fd, offset, this, this->pCompletionGroup_ ? this->pAltEvent : this->loopSource_.get()))
|
||||||
{
|
{
|
||||||
LIOS_SendProcess(0, true, errno);
|
LIOS_SendProcess(0, true, errno);
|
||||||
return false;
|
return false;
|
||||||
@ -424,6 +449,44 @@ namespace Aurora::IO::FS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LinuxAsyncFileTransaction::TryAttachToCompletionGroup(const AuSPtr<CompletionGroup::ICompletionGroup> &pCompletionGroup)
|
||||||
|
{
|
||||||
|
if (!pCompletionGroup)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto pLoopSource = pCompletionGroup->GetTriggerLoopSource();
|
||||||
|
if (!pLoopSource)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCompletionGroup->AddWorkItem(this->SharedFromThis());
|
||||||
|
this->pAltEvent = AuStaticCast<Loop::LSEvent>(pLoopSource).get();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompletionGroup::ICompletionGroupWorkHandle *LinuxAsyncFileTransaction::ToCompletionGroupHandle()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AuSPtr<CompletionGroup::ICompletionGroup> LinuxAsyncFileTransaction::GetCompletionGroup()
|
||||||
|
{
|
||||||
|
return this->pCompletionGroup_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LinuxAsyncFileTransaction::HasCompletedForGCWI()
|
||||||
|
{
|
||||||
|
return this->HasCompleted();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LinuxAsyncFileTransaction::CleanupForGCWI()
|
||||||
|
{
|
||||||
|
AuResetMember(this->pCompletionGroup_);
|
||||||
|
}
|
||||||
|
|
||||||
void LinuxAsyncFileTransaction::LIOS_Process(AuUInt32 read, bool failure, int err, bool mark)
|
void LinuxAsyncFileTransaction::LIOS_Process(AuUInt32 read, bool failure, int err, bool mark)
|
||||||
{
|
{
|
||||||
this->lastFinishedStat_ = failure ? 0 : read;
|
this->lastFinishedStat_ = failure ? 0 : read;
|
||||||
@ -518,7 +581,14 @@ namespace Aurora::IO::FS
|
|||||||
|
|
||||||
AuSPtr<Loop::ILoopSource> LinuxAsyncFileTransaction::NewLoopSource()
|
AuSPtr<Loop::ILoopSource> LinuxAsyncFileTransaction::NewLoopSource()
|
||||||
{
|
{
|
||||||
return AuStaticCast<Loop::ILoopSource>(AuStaticCast<Loop::ILSEvent>(this->loopSource_));
|
if (this->pCompletionGroup_)
|
||||||
|
{
|
||||||
|
return this->pCompletionGroup_->ToAnyLoopSource();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return AuStaticCast<Loop::ILoopSource>(AuStaticCast<Loop::ILSEvent>(this->loopSource_));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AUKN_SYM IAsyncFileStream *OpenAsyncNew(const AuString &path, EFileOpenMode openMode, bool bDirectIO, EFileAdvisoryLockLevel lock)
|
AUKN_SYM IAsyncFileStream *OpenAsyncNew(const AuString &path, EFileOpenMode openMode, bool bDirectIO, EFileAdvisoryLockLevel lock)
|
||||||
|
@ -44,7 +44,10 @@ namespace Aurora::IO::FS
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct LinuxAsyncFileTransaction : IAsyncTransaction, AuEnableSharedFromThis<LinuxAsyncFileTransaction>, Aurora::IO::UNIX::ASubmittable
|
struct LinuxAsyncFileTransaction : IAsyncTransaction,
|
||||||
|
CompletionGroup::ICompletionGroupWorkItem,
|
||||||
|
AuEnableSharedFromThis<LinuxAsyncFileTransaction>,
|
||||||
|
Aurora::IO::UNIX::ASubmittable
|
||||||
{
|
{
|
||||||
LinuxAsyncFileTransaction(AuSPtr<ProcessBlock> pProcessBlock);
|
LinuxAsyncFileTransaction(AuSPtr<ProcessBlock> pProcessBlock);
|
||||||
~LinuxAsyncFileTransaction();
|
~LinuxAsyncFileTransaction();
|
||||||
@ -75,7 +78,16 @@ namespace Aurora::IO::FS
|
|||||||
|
|
||||||
void SetBaseOffset(AuUInt64 uBaseOffset) override;
|
void SetBaseOffset(AuUInt64 uBaseOffset) override;
|
||||||
|
|
||||||
virtual void LIOS_Process(AuUInt32 read, bool failure, int err, bool mark) override;
|
void LIOS_Process(AuUInt32 read, bool failure, int err, bool mark) override;
|
||||||
|
|
||||||
|
bool TryAttachToCompletionGroup(const AuSPtr<CompletionGroup::ICompletionGroup> &pCompletionGroup) override;
|
||||||
|
|
||||||
|
CompletionGroup::ICompletionGroupWorkHandle *ToCompletionGroupHandle() override;
|
||||||
|
|
||||||
|
AuSPtr<CompletionGroup::ICompletionGroup> GetCompletionGroup() override;
|
||||||
|
|
||||||
|
bool HasCompletedForGCWI() override;
|
||||||
|
void CleanupForGCWI() override;
|
||||||
|
|
||||||
AuSPtr<ProcessBlock> pProcessBlock_;
|
AuSPtr<ProcessBlock> pProcessBlock_;
|
||||||
private:
|
private:
|
||||||
@ -85,9 +97,11 @@ namespace Aurora::IO::FS
|
|||||||
AuUInt64 uBaseOffset {};
|
AuUInt64 uBaseOffset {};
|
||||||
bool latch_ {};
|
bool latch_ {};
|
||||||
bool bTxFinished_ {};
|
bool bTxFinished_ {};
|
||||||
|
AuSPtr<CompletionGroup::ICompletionGroup> pCompletionGroup_;
|
||||||
AuSPtr<IAsyncFinishedSubscriber> sub_;
|
AuSPtr<IAsyncFinishedSubscriber> sub_;
|
||||||
AuSPtr<LinuxAsyncFileTransactionLoopSource> loopSource_;
|
AuSPtr<LinuxAsyncFileTransactionLoopSource> loopSource_;
|
||||||
int error_ {};
|
int error_ {};
|
||||||
bool hasError_ {};
|
bool hasError_ {};
|
||||||
|
Loop::ILSEvent *pAltEvent {};
|
||||||
};
|
};
|
||||||
}
|
}
|
78
Source/IO/FS/FSPlatformDevices.Linux.cpp
Normal file
78
Source/IO/FS/FSPlatformDevices.Linux.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/***
|
||||||
|
Copyright (C) 2023 Jamie Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||||
|
|
||||||
|
File: FSPlatformDevices.Linux.cpp
|
||||||
|
Date: 2023-08-11
|
||||||
|
Date: 2024-02-XX
|
||||||
|
Author: Reece
|
||||||
|
***/
|
||||||
|
// TODO: recover work in progress work dated last year
|
||||||
|
#include <Source/RuntimeInternal.hpp>
|
||||||
|
#include "FS.hpp"
|
||||||
|
#include "FSPlatformDevices.hpp"
|
||||||
|
|
||||||
|
namespace Aurora::IO::FS
|
||||||
|
{
|
||||||
|
AUKN_SYM AuString GetRootFromPath(const AuString &path)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuResult<AuString> GetDeviceFromPath(const AuString &path)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuResult<AuString> GetLogicalMountFromPath(const AuString &fileOrDirPath)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuResult<AuString> GetDeviceFromRoot(const AuString &root)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuUInt32 GetLogicalSectorSizeFromPath(const AuString &path)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM LogicalUsedResponse GetLogicalUsedFromLogicalDevice(const AuString &logicalMountPath)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuUInt64 GetDeviceSizeInBytes(const AuString &physicalDevicePath)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuUInt32 GetPhysicalSectorSizeFromPath(const AuString &path)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AuList<FSDevice> SysGetFSDevices()
|
||||||
|
{
|
||||||
|
AuList<FSDevice> devices;
|
||||||
|
|
||||||
|
return devices;
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM AuUInt32 GetPerformanceBufferSizeFromPath(const AuString &path)
|
||||||
|
{
|
||||||
|
return 4096;
|
||||||
|
}
|
||||||
|
|
||||||
|
AUKN_SYM LogicalUsedResponse GetLogicalUsedFromPath(const AuString &path)
|
||||||
|
{
|
||||||
|
auto rootPath = GetLogicalMountFromPath(path);
|
||||||
|
if (!rootPath)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetLogicalUsedFromLogicalDevice(rootPath.GetResult());
|
||||||
|
}
|
||||||
|
}
|
@ -229,7 +229,7 @@ namespace Aurora::IO::Loop
|
|||||||
src->timeoutAbs = (AuUInt64)ms + AuTime::SteadyClockMS();
|
src->timeoutAbs = (AuUInt64)ms + AuTime::SteadyClockMS();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AuTryInsert(this->sources_, src))
|
if (!AuTryInsert(this->sources_, AuConstReference(src)))
|
||||||
{
|
{
|
||||||
pWaitable->Unlock();
|
pWaitable->Unlock();
|
||||||
return false;
|
return false;
|
||||||
|
@ -28,7 +28,7 @@ namespace Aurora::IO::Net
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AuTryInsert(this->workerPool_, worker))
|
if (!AuTryInsert(this->workerPool_, AuConstReference(worker)))
|
||||||
{
|
{
|
||||||
SysPushErrorIO("");
|
SysPushErrorIO("");
|
||||||
return {};
|
return {};
|
||||||
|
@ -77,11 +77,15 @@ namespace Aurora::IO::Net
|
|||||||
{
|
{
|
||||||
AuLoop::ILSEvent *optEvent {};
|
AuLoop::ILSEvent *optEvent {};
|
||||||
|
|
||||||
if (auto pLoopSource = this->pCompletionGroup_->GetTriggerLoopSource())
|
if (this->pCompletionGroup_)
|
||||||
{
|
{
|
||||||
optEvent = AuStaticCast<Loop::LSEvent>(pLoopSource).get();
|
if (auto pLoopSource = this->pCompletionGroup_->GetTriggerLoopSource())
|
||||||
|
{
|
||||||
|
optEvent = AuStaticCast<Loop::LSEvent>(pLoopSource).get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (!optEvent)
|
||||||
{
|
{
|
||||||
if (auto pWaitable = this->pWaitable)
|
if (auto pWaitable = this->pWaitable)
|
||||||
{
|
{
|
||||||
@ -89,7 +93,7 @@ namespace Aurora::IO::Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!UNIX::LinuxOverlappedSubmitRead(this->GetSocket(), 0, this, optEvent))
|
if (!UNIX::LinuxOverlappedSubmitRead(this->GetSocket(), 0, this, optEvent, true))
|
||||||
{
|
{
|
||||||
LIOS_SendProcess(0, true, errno);
|
LIOS_SendProcess(0, true, errno);
|
||||||
return true;
|
return true;
|
||||||
@ -159,11 +163,15 @@ namespace Aurora::IO::Net
|
|||||||
{
|
{
|
||||||
AuLoop::ILSEvent *optEvent {};
|
AuLoop::ILSEvent *optEvent {};
|
||||||
|
|
||||||
if (auto pLoopSource = this->pCompletionGroup_->GetTriggerLoopSource())
|
if (this->pCompletionGroup_)
|
||||||
{
|
{
|
||||||
optEvent = AuStaticCast<Loop::LSEvent>(pLoopSource).get();
|
if (auto pLoopSource = this->pCompletionGroup_->GetTriggerLoopSource())
|
||||||
|
{
|
||||||
|
optEvent = AuStaticCast<Loop::LSEvent>(pLoopSource).get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (!optEvent)
|
||||||
{
|
{
|
||||||
if (auto pWaitable = this->pWaitable)
|
if (auto pWaitable = this->pWaitable)
|
||||||
{
|
{
|
||||||
@ -323,16 +331,21 @@ namespace Aurora::IO::Net
|
|||||||
{
|
{
|
||||||
AuLoop::ILSEvent *optEvent {};
|
AuLoop::ILSEvent *optEvent {};
|
||||||
|
|
||||||
if (auto pLoopSource = this->pCompletionGroup_->GetTriggerLoopSource())
|
if (this->pCompletionGroup_)
|
||||||
{
|
{
|
||||||
return pLoopSource;
|
if (auto pLoopSource = this->pCompletionGroup_->GetTriggerLoopSource())
|
||||||
|
{
|
||||||
|
return pLoopSource;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (auto pWaitable = this->pWaitable)
|
if (auto pWaitable = this->pWaitable)
|
||||||
{
|
{
|
||||||
return pWaitable;
|
return pWaitable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return this->pWaitable = AuLoop::NewLSEventSlow(false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
@ -359,7 +372,7 @@ namespace Aurora::IO::Net
|
|||||||
|
|
||||||
void LinuxAsyncNetworkTransaction::MakeSyncable()
|
void LinuxAsyncNetworkTransaction::MakeSyncable()
|
||||||
{
|
{
|
||||||
this->pWaitable = AuLoop::NewLSEvent(false, true);
|
this->pWaitable = AuLoop::NewLSEventSlow(false, true);
|
||||||
SysAssert(this->pWaitable);
|
SysAssert(this->pWaitable);
|
||||||
//this->overlap.hEvent = (HANDLE)AuStaticCast<Loop::LSEvent>(this->pWaitable)->GetHandle();
|
//this->overlap.hEvent = (HANDLE)AuStaticCast<Loop::LSEvent>(this->pWaitable)->GetHandle();
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ namespace Aurora::IO::Net
|
|||||||
workerIndex_(workerIndex),
|
workerIndex_(workerIndex),
|
||||||
pIOProcessor_(pIOProcessor)
|
pIOProcessor_(pIOProcessor)
|
||||||
{
|
{
|
||||||
this->pEvent_ = AuLoop::NewLSEvent(false, true);
|
this->pEvent_ = AuLoop::NewLSEventSlow(false, true);
|
||||||
SysAssert(bool(this->pEvent_));
|
SysAssert(bool(this->pEvent_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
namespace Aurora::IO::UNIX
|
namespace Aurora::IO::UNIX
|
||||||
{
|
{
|
||||||
|
static bool LinuxOverlappedWriteWait(int fd, AuUInt offset, ASubmittable *context, AuLoop::ILSEvent *optEvent);
|
||||||
static bool LinuxOverlappedSubmit(int fd, int op, AuUInt offset, ASubmittable *context, AuLoop::ILSEvent *optEvent);
|
static bool LinuxOverlappedSubmit(int fd, int op, AuUInt offset, ASubmittable *context, AuLoop::ILSEvent *optEvent);
|
||||||
static bool LinuxOverlappedCancel(ASubmittable *context);
|
static bool LinuxOverlappedCancel(ASubmittable *context);
|
||||||
|
|
||||||
@ -72,6 +73,8 @@ namespace Aurora::IO::UNIX
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: re-add LinuxOverlappedWriteWait?
|
||||||
|
|
||||||
LIOS_Reset();
|
LIOS_Reset();
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -480,6 +483,38 @@ namespace Aurora::IO::UNIX
|
|||||||
return AuTryInsert(io->submitPendingArray, &submit);
|
return AuTryInsert(io->submitPendingArray, &submit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool LinuxOverlappedWriteWait(int fd, AuUInt offset, ASubmittable *context, AuLoop::ILSEvent *optEvent)
|
||||||
|
{
|
||||||
|
auto io = GetTls();
|
||||||
|
if (!io)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
context->bIsWritePending = true;
|
||||||
|
|
||||||
|
context->offset2 = offset; // redundant - always zero
|
||||||
|
context->fd2 = fd;
|
||||||
|
context->optEvent2 = optEvent;
|
||||||
|
|
||||||
|
auto &submit = context->GetIOCB();
|
||||||
|
submit.aio_data = context->GetData();
|
||||||
|
submit.aio_lio_opcode = IOCB_CMD_POLL;
|
||||||
|
submit.aio_reqprio = 0;
|
||||||
|
submit.aio_fildes = context->GetOrCreateFdPollForBlockingRead(fd);
|
||||||
|
submit.aio_offset = 0;
|
||||||
|
submit.aio_buf = POLLOUT;
|
||||||
|
submit.aio_nbytes = 0;
|
||||||
|
|
||||||
|
if (submit.aio_fildes == -1)
|
||||||
|
{
|
||||||
|
SysPushErrorIO();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AuTryInsert(io->submitPendingArray, &submit);
|
||||||
|
}
|
||||||
|
|
||||||
bool LinuxOverlappedSubmitRead(int fd, AuUInt offset, ASubmittable *context, AuLoop::ILSEvent *optEvent, bool bWaitForRead)
|
bool LinuxOverlappedSubmitRead(int fd, AuUInt offset, ASubmittable *context, AuLoop::ILSEvent *optEvent, bool bWaitForRead)
|
||||||
{
|
{
|
||||||
if (bWaitForRead)
|
if (bWaitForRead)
|
||||||
@ -544,6 +579,11 @@ namespace Aurora::IO::UNIX
|
|||||||
for (AU_ITERATE_N(i, temp))
|
for (AU_ITERATE_N(i, temp))
|
||||||
{
|
{
|
||||||
auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data);
|
auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data);
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
io->dwIoSubmits--;
|
io->dwIoSubmits--;
|
||||||
|
|
||||||
auto errNo = 0;
|
auto errNo = 0;
|
||||||
@ -611,6 +651,7 @@ namespace Aurora::IO::UNIX
|
|||||||
int LinuxOverlappedEpollShim(int epfd, struct epoll_event *events,
|
int LinuxOverlappedEpollShim(int epfd, struct epoll_event *events,
|
||||||
int maxevents, int timeout)
|
int maxevents, int timeout)
|
||||||
{
|
{
|
||||||
|
bool bRet { true };
|
||||||
timespec targetTime;
|
timespec targetTime;
|
||||||
auto io = GetTls();
|
auto io = GetTls();
|
||||||
if (!io)
|
if (!io)
|
||||||
@ -667,8 +708,8 @@ namespace Aurora::IO::UNIX
|
|||||||
AuUInt64 uTimeNow = AuTime::SteadyClockNS();
|
AuUInt64 uTimeNow = AuTime::SteadyClockNS();
|
||||||
if (uTargetTime <= uTimeNow)
|
if (uTargetTime <= uTimeNow)
|
||||||
{
|
{
|
||||||
errno = EINTR;
|
bRet = false;
|
||||||
return -1;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
AuTime::ns2ts(&targetTime, uTimeNow - uTargetTime);
|
AuTime::ns2ts(&targetTime, uTimeNow - uTargetTime);
|
||||||
@ -680,13 +721,7 @@ namespace Aurora::IO::UNIX
|
|||||||
{
|
{
|
||||||
for (AU_ITERATE_N(i, temp))
|
for (AU_ITERATE_N(i, temp))
|
||||||
{
|
{
|
||||||
auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data);
|
if (auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data))
|
||||||
if (!handle)
|
|
||||||
{
|
|
||||||
// loop source has message
|
|
||||||
bEpollTriggered = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
io->dwIoSubmits--;
|
io->dwIoSubmits--;
|
||||||
|
|
||||||
@ -706,6 +741,10 @@ namespace Aurora::IO::UNIX
|
|||||||
|
|
||||||
handle->LIOS_SendProcess(bytesTransacted, bError, errNo);
|
handle->LIOS_SendProcess(bytesTransacted, bError, errNo);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bEpollTriggered = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -742,33 +781,44 @@ namespace Aurora::IO::UNIX
|
|||||||
}
|
}
|
||||||
} while ((timeout ? !bEpollTriggered : false) || AuExchange(bAgain, false));
|
} while ((timeout ? !bEpollTriggered : false) || AuExchange(bAgain, false));
|
||||||
|
|
||||||
|
exit:
|
||||||
io_event finalEpollEvent {};
|
io_event finalEpollEvent {};
|
||||||
if ((bEpollTriggered) ||
|
if (!bEpollTriggered)
|
||||||
(io_cancel(io->context, ptr, &finalEpollEvent) == 0))
|
|
||||||
{
|
{
|
||||||
// TODO (Reece): if finalEpollEvent.res == 1, bEpollTriggered = true?
|
if (io_cancel(io->context, ptr, &finalEpollEvent) != 0)
|
||||||
}
|
{
|
||||||
else
|
if (errno != EINPROGRESS)
|
||||||
{
|
{
|
||||||
// Do I care?
|
if (errno != EINVAL) // ?
|
||||||
SysPushErrorIO();
|
{
|
||||||
// I don't
|
SysPushErrorIO("{}", errno);
|
||||||
// I do again
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LinuxOverlappedYield();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bEpollTriggered)
|
if (bEpollTriggered)
|
||||||
{
|
{
|
||||||
return epoll_wait(epfd, events, maxevents, 0);
|
return epoll_wait(epfd, events, maxevents, 0);
|
||||||
}
|
}
|
||||||
else
|
else if (bRet)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LinuxOverlappedWaitForOne(AuUInt32 timeout, AuUInt read, AuUInt write, bool &bReadTriggered, bool &bWriteTriggered)
|
bool LinuxOverlappedWaitForOne(AuUInt32 timeout, AuUInt read, AuUInt write, bool &bReadTriggered, bool &bWriteTriggered)
|
||||||
{
|
{
|
||||||
timespec targetTime;
|
timespec targetTime;
|
||||||
|
bool bRet { true };
|
||||||
auto io = GetTls();
|
auto io = GetTls();
|
||||||
|
|
||||||
bWriteTriggered = false;
|
bWriteTriggered = false;
|
||||||
@ -842,8 +892,8 @@ namespace Aurora::IO::UNIX
|
|||||||
AuUInt64 uTimeNow = AuTime::SteadyClockNS();
|
AuUInt64 uTimeNow = AuTime::SteadyClockNS();
|
||||||
if (uTargetTime <= uTimeNow)
|
if (uTargetTime <= uTimeNow)
|
||||||
{
|
{
|
||||||
errno = EINTR;
|
bRet = false;
|
||||||
return false;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
AuTime::ns2ts(&targetTime, uTimeNow - uTargetTime);
|
AuTime::ns2ts(&targetTime, uTimeNow - uTargetTime);
|
||||||
@ -866,7 +916,11 @@ namespace Aurora::IO::UNIX
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data);
|
auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data);
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
io->dwIoSubmits--;
|
io->dwIoSubmits--;
|
||||||
|
|
||||||
auto errNo = 0;
|
auto errNo = 0;
|
||||||
@ -915,6 +969,7 @@ namespace Aurora::IO::UNIX
|
|||||||
|
|
||||||
} while (timeout ? (!bReadTriggered && !bWriteTriggered) : false);
|
} while (timeout ? (!bReadTriggered && !bWriteTriggered) : false);
|
||||||
|
|
||||||
|
exit:
|
||||||
for (int i = 0; i < iocbIdx; i++)
|
for (int i = 0; i < iocbIdx; i++)
|
||||||
{
|
{
|
||||||
io_event finalEpollEvent {};
|
io_event finalEpollEvent {};
|
||||||
@ -932,20 +987,24 @@ namespace Aurora::IO::UNIX
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (io_cancel(io->context, ptrArray[i], &finalEpollEvent) == 0)
|
// "Fun". Undocumented return values to indicate we need to double our syscall count bc Linux devs cant design shit.
|
||||||
|
if (io_cancel(io->context, ptrArray[i], &finalEpollEvent) != 0)
|
||||||
{
|
{
|
||||||
// TODO (Reece): if finalEpollEvent.res == 1, bEpollTriggered = true?
|
if (errno != EINPROGRESS)
|
||||||
}
|
{
|
||||||
else
|
if (errno != EINVAL) // ?
|
||||||
{
|
{
|
||||||
// Do I care?
|
SysPushErrorIO("{}", errno);
|
||||||
SysPushErrorIO();
|
}
|
||||||
// I don't
|
}
|
||||||
// I do again
|
else
|
||||||
|
{
|
||||||
|
LinuxOverlappedYield();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return bRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LinuxOverlappedWaitForAtleastOne(AuUInt32 timeout, const AuList<AuUInt> &handles, const AuList<AuUInt> &handlesWrite, AuUInt &one, AuUInt &two)
|
bool LinuxOverlappedWaitForAtleastOne(AuUInt32 timeout, const AuList<AuUInt> &handles, const AuList<AuUInt> &handlesWrite, AuUInt &one, AuUInt &two)
|
||||||
@ -986,6 +1045,10 @@ namespace Aurora::IO::UNIX
|
|||||||
for (AU_ITERATE_N(i, temp))
|
for (AU_ITERATE_N(i, temp))
|
||||||
{
|
{
|
||||||
auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data);
|
auto handle = AuReinterpretCast<ASubmittable *>(ioEvents[i].data);
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
io->dwIoSubmits--;
|
io->dwIoSubmits--;
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ namespace Aurora::IO::UNIX
|
|||||||
|
|
||||||
// Hack for blocking reads
|
// Hack for blocking reads
|
||||||
bool bIsReadPending {};
|
bool bIsReadPending {};
|
||||||
|
bool bIsWritePending {};
|
||||||
AuUInt64 offset2 {};
|
AuUInt64 offset2 {};
|
||||||
int fd2 {};
|
int fd2 {};
|
||||||
AuLoop::ILSEvent *optEvent2 {};
|
AuLoop::ILSEvent *optEvent2 {};
|
||||||
|
@ -601,8 +601,6 @@ namespace Aurora::Threading::Threads
|
|||||||
|
|
||||||
void OSThread::_ThreadEP()
|
void OSThread::_ThreadEP()
|
||||||
{
|
{
|
||||||
AU_DEBUG_MEMCRUNCH;
|
|
||||||
|
|
||||||
// Poke TLS reference thread entity
|
// Poke TLS reference thread entity
|
||||||
// TODO: we need an internal OSThread *TryPokeTLSThread()
|
// TODO: we need an internal OSThread *TryPokeTLSThread()
|
||||||
auto osThread = static_cast<OSThread *>(GetThread());
|
auto osThread = static_cast<OSThread *>(GetThread());
|
||||||
@ -631,6 +629,8 @@ namespace Aurora::Threading::Threads
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
AU_DEBUG_MEMCRUNCH;
|
||||||
|
|
||||||
if (auto task = task_)
|
if (auto task = task_)
|
||||||
{
|
{
|
||||||
this->epExecEvent->Set();
|
this->epExecEvent->Set();
|
||||||
@ -848,6 +848,8 @@ namespace Aurora::Threading::Threads
|
|||||||
|
|
||||||
void OSThread::OSAttach()
|
void OSThread::OSAttach()
|
||||||
{
|
{
|
||||||
|
AU_DEBUG_MEMCRUNCH;
|
||||||
|
|
||||||
HandleRegister(this);
|
HandleRegister(this);
|
||||||
#if defined(AURORA_IS_LINUX_DERIVED)
|
#if defined(AURORA_IS_LINUX_DERIVED)
|
||||||
this->unixThreadId_ = gettid();
|
this->unixThreadId_ = gettid();
|
||||||
|
Loading…
Reference in New Issue
Block a user