[+] AuUTF8StringView polyfil
[*] NT Loop queue improvements
This commit is contained in:
parent
3e80022f95
commit
90af80ae2c
7
Include/auROXTL/auUTF8StringView.hpp
Normal file
7
Include/auROXTL/auUTF8StringView.hpp
Normal file
@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
// TODO:
|
||||
|
||||
using AuUTF8StringView = std::string_view;
|
||||
|
||||
using AuU8View = AuUTF8StringView;
|
@ -32,6 +32,7 @@
|
||||
#include <auROXTL/auMemoryModel.hpp>
|
||||
#include <auROXTL/auOptionalEx.hpp>
|
||||
#include <auROXTL/auString.hpp>
|
||||
#include <auROXTL/auUTF8StringView.hpp>
|
||||
#include <auROXTL/auFunctional.hpp>
|
||||
#include <auROXTL/auArray.hpp>
|
||||
#include <auROXTL/auList.hpp>
|
||||
|
@ -521,8 +521,98 @@ namespace Aurora::Loop
|
||||
// Ingore the other unrelated errors (APC notification, timeout, etc)
|
||||
}
|
||||
|
||||
// OK - All signals are set
|
||||
|
||||
// Take ownership of the queue ready for a potential purge of objects
|
||||
StartUserAndTakeOwn();
|
||||
ConsiderEvicitingTimeoutsAll();
|
||||
|
||||
// Le great iterate
|
||||
Iterator queueIterator(this);
|
||||
AuSInt indexOffset {};
|
||||
for (queueIterator.Start(); queueIterator.End() != queueIterator.itr; )
|
||||
{
|
||||
bool shouldRemove {true};
|
||||
auto &source = *queueIterator.itr;
|
||||
|
||||
if (source.source)
|
||||
{
|
||||
if (source.source->OnTrigger(source.source->Singular() ? source.source->GetHandle() : source.source->GetHandles()[0]))
|
||||
{
|
||||
AU_LOCK_GUARD(const_cast<AuThreadPrimitives::SpinLock *>(&source.lock)) // this spinlock really does feel like a hack
|
||||
|
||||
for (const auto &handler : source.callbacks.extended)
|
||||
{
|
||||
try
|
||||
{
|
||||
shouldRemove &= handler->OnFinished(source.source);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
SysPushErrorCatch();
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldRemove)
|
||||
{
|
||||
for (const auto &handler : source.callbacks.base)
|
||||
{
|
||||
try
|
||||
{
|
||||
shouldRemove &= handler->OnFinished(source.source);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
SysPushErrorCatch();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((source.callbacks.base.empty()) &&
|
||||
(source.callbacks.extended.empty()))
|
||||
{
|
||||
shouldRemove = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (source.ConsiderTimeout())
|
||||
{
|
||||
shouldRemove = true;
|
||||
}
|
||||
|
||||
source.source->OnFinishSleep();
|
||||
|
||||
if (shouldRemove)
|
||||
{
|
||||
if (source.source->GetType() == ELoopSource::eSourceWin32)
|
||||
{
|
||||
SysPanic("?");
|
||||
}
|
||||
else
|
||||
{
|
||||
AuUInt uHandles = (source.source->Singular() ? 1 : source.source->GetHandles().size());
|
||||
int sOffset = -(uHandles);
|
||||
if (this->handleArrayOr_.size() > MAXIMUM_WAIT_OBJECTS)
|
||||
{
|
||||
this->RemoveSourceNB(source.source);
|
||||
this->willCommitInFuture_ = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
AuRemoveRange(this->handleArrayOr_, queueIterator.startingIndexOr + indexOffset, uHandles);
|
||||
AuRemoveRange(this->handleArrayAnd_, queueIterator.startingIndexAnd + indexOffset, uHandles);
|
||||
queueIterator.Delete(this->loopSourceExs_.erase(queueIterator.itr));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
//else
|
||||
{
|
||||
queueIterator.Next();
|
||||
}
|
||||
}
|
||||
|
||||
StartUserAndTakeOwn_Release();
|
||||
|
||||
return bReturnStatus;
|
||||
@ -745,7 +835,7 @@ namespace Aurora::Loop
|
||||
|
||||
AU_LOCK_GUARD(const_cast<AuThreadPrimitives::SpinLock *>(&source.lock)) // this spinlock really does feel like a hack
|
||||
|
||||
for (const auto &handler : source.callbacks.base)
|
||||
for (const auto &handler : source.callbacks.extended)
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -759,7 +849,7 @@ namespace Aurora::Loop
|
||||
|
||||
if (shouldRemove)
|
||||
{
|
||||
for (const auto &handler : source.callbacks.extended)
|
||||
for (const auto &handler : source.callbacks.base)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user