[*] Ensure failure on waiters if a task we're waiting on has already failed
This commit is contained in:
parent
452b49b610
commit
23ddb0f2f6
@ -45,6 +45,12 @@ namespace Aurora::Async
|
|||||||
{
|
{
|
||||||
auto dependency = std::reinterpret_pointer_cast<WorkItem>(workItem);
|
auto dependency = std::reinterpret_pointer_cast<WorkItem>(workItem);
|
||||||
Threading::LockGuard<Threading::Primitives::SpinLock> l2(dependency->lock);
|
Threading::LockGuard<Threading::Primitives::SpinLock> l2(dependency->lock);
|
||||||
|
|
||||||
|
if (dependency->HasFailed())
|
||||||
|
{
|
||||||
|
Fail();
|
||||||
|
}
|
||||||
|
|
||||||
dependency->waiters_.push_back(shared_from_this());
|
dependency->waiters_.push_back(shared_from_this());
|
||||||
waitOn_.push_back(workItem);
|
waitOn_.push_back(workItem);
|
||||||
}
|
}
|
||||||
@ -77,6 +83,11 @@ namespace Aurora::Async
|
|||||||
dispatchPending_ = true;
|
dispatchPending_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (HasFailed())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto itr = waitOn_.begin(); itr != waitOn_.end(); )
|
for (auto itr = waitOn_.begin(); itr != waitOn_.end(); )
|
||||||
{
|
{
|
||||||
auto &waitable = *itr;
|
auto &waitable = *itr;
|
||||||
@ -98,9 +109,9 @@ namespace Aurora::Async
|
|||||||
SendOff();
|
SendOff();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void WorkItem::CancelAsync()
|
void WorkItem::CancelAsync()
|
||||||
{
|
{
|
||||||
|
Threading::LockGuard<Threading::Primitives::SpinLock> l(lock);
|
||||||
Fail();
|
Fail();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,8 +141,9 @@ namespace Aurora::Async
|
|||||||
SetSchedTime(info.reschedMs);
|
SetSchedTime(info.reschedMs);
|
||||||
}
|
}
|
||||||
WaitFor(info.waitFor);
|
WaitFor(info.waitFor);
|
||||||
// fall through
|
|
||||||
}
|
}
|
||||||
|
[[fallthrough]];
|
||||||
case IWorkItemHandler::EProcessNext::eRerun:
|
case IWorkItemHandler::EProcessNext::eRerun:
|
||||||
{
|
{
|
||||||
DispatchEx(false);
|
DispatchEx(false);
|
||||||
|
Loading…
Reference in New Issue
Block a user