[*] Adjust PId_t::pool null behaviour

This commit is contained in:
Reece Wilson 2023-09-15 16:41:10 +01:00
parent 3ba93439c8
commit addd4080b2
4 changed files with 15 additions and 37 deletions

View File

@ -25,7 +25,6 @@ namespace Aurora::Async
/// ///
AUKN_SYM WorkerPId_t GetCurrentWorkerPId(); AUKN_SYM WorkerPId_t GetCurrentWorkerPId();
/// Async app only | Thread pools must use the IThreadPool::NewFence function
AUKN_SYM AuSPtr<IWorkItem> NewWorkItem(const WorkerId_t &worker, const AuSPtr<IWorkItemHandler> &task); AUKN_SYM AuSPtr<IWorkItem> NewWorkItem(const WorkerId_t &worker, const AuSPtr<IWorkItemHandler> &task);
/** /**
@ -47,9 +46,7 @@ namespace Aurora::Async
/// Async app only | Thread pools must use the IThreadPool::NewFence function /// Async app only | Thread pools must use the IThreadPool::NewFence function
AUKN_SYM AuSPtr<IWorkItem> NewFence(); AUKN_SYM AuSPtr<IWorkItem> NewFence();
/// Allocates a new thread pool for usage
AUKN_SYM AuSPtr<IThreadPool> NewThreadPool(); AUKN_SYM AuSPtr<IThreadPool> NewThreadPool();
///
AUKN_SYM void SetMainThreadForSysPumpScheduling(WorkerPId_t pid); AUKN_SYM void SetMainThreadForSysPumpScheduling(WorkerPId_t pid);
} }

View File

@ -80,6 +80,9 @@ namespace Aurora::Async
inline WorkerPId_t(const AuSPtr<IThreadPool> &pool, const WorkerId_t &cpy) : WorkerId_t(cpy.first, cpy.second), pool(pool) inline WorkerPId_t(const AuSPtr<IThreadPool> &pool, const WorkerId_t &cpy) : WorkerId_t(cpy.first, cpy.second), pool(pool)
{} {}
inline WorkerPId_t(ThreadGroup_t group, ThreadId_t id) : WorkerId_t(group, id)
{ }
AuSPtr<IThreadPool> pool; AuSPtr<IThreadPool> pool;
inline AuUInt HashCode() const noexcept inline AuUInt HashCode() const noexcept
@ -91,10 +94,5 @@ namespace Aurora::Async
{ {
return in.pool == this->pool && in.first == this->first && this->second == in.second; return in.pool == this->pool && in.first == this->first && this->second == in.second;
} }
inline operator bool() const
{
return pool;
}
}; };
} }

View File

@ -71,7 +71,7 @@ public:
} }
else else
{ {
SysAssert(this->pid == AuAsync::GetCurrentWorkerPId()); SysAssert(this->pid.value() == AuAsync::GetCurrentWorkerPId());
} }
} }
@ -103,7 +103,7 @@ public:
} }
else else
{ {
SysAssert(this->pid == AuAsync::GetCurrentWorkerPId()); SysAssert(this->pid.value() == AuAsync::GetCurrentWorkerPId());
} }
this->onFailure = onFailure; this->onFailure = onFailure;
@ -216,7 +216,7 @@ private:
void SubmitComplete() void SubmitComplete()
{ {
if (AuAsync::GetCurrentWorkerPId() == this->pid) if (AuAsync::GetCurrentWorkerPId() == this->pid.value())
{ {
if (!this->onFailure && !this->callback) if (!this->onFailure && !this->callback)
{ {

View File

@ -453,18 +453,9 @@ namespace Aurora::Async
this->owner_->Run(this->worker_, AuSharedFromThis()); this->owner_->Run(this->worker_, AuSharedFromThis());
} }
} }
static auto GetWorkerInternal()
{
return static_cast<AsyncApp *>(GetAsyncApp());
}
inline auto GetWorkerInternal(const AuSPtr<IThreadPool> &pool) inline auto ToInternal(const AuSPtr<IThreadPool> &pool)
{ {
if (pool.get() == AuStaticCast<IAsyncApp>(gAsyncApp))
{
return AuUnsafeRaiiToShared(AuStaticCast<ThreadPool>(gAsyncApp));
}
return AuStaticPointerCast<ThreadPool>(pool); return AuStaticPointerCast<ThreadPool>(pool);
} }
@ -486,7 +477,9 @@ namespace Aurora::Async
return {}; return {};
} }
return AuMakeShared<WorkItem>(GetWorkerInternal(), WorkerPId_t { AuAsync::GetCurrentWorkerPId().pool, worker }, task); auto pWorker = GetCurrentWorkerPId().pool;
if (!pWorker) AuUnsafeRaiiToShared(gAsyncApp);
return AuMakeShared<WorkItem>(ToInternal(pWorker).get(), WorkerPId_t { pWorker , worker }, task);
} }
AUKN_SYM AuSPtr<IWorkItem> NewWorkFunction(const WorkerPId_t &worker, AuVoidFunc func) AUKN_SYM AuSPtr<IWorkItem> NewWorkFunction(const WorkerPId_t &worker, AuVoidFunc func)
@ -499,13 +492,7 @@ namespace Aurora::Async
return {}; return {};
} }
if (!worker) return AuMakeSharedThrow<FuncWorker>(ToInternal(worker.pool).get(), worker, AuMove(func));
{
SysPushErrorArg("invalid worker");
return {};
}
return AuMakeSharedThrow<FuncWorker>(GetWorkerInternal(worker.pool).get(), worker, AuMove(func));
} }
AUKN_SYM AuSPtr<IWorkItem> NewWorkItem(const WorkerPId_t &worker, const AuSPtr<IWorkItemHandler> &task) AUKN_SYM AuSPtr<IWorkItem> NewWorkItem(const WorkerPId_t &worker, const AuSPtr<IWorkItemHandler> &task)
@ -518,18 +505,14 @@ namespace Aurora::Async
return {}; return {};
} }
if (!worker) return AuMakeSharedThrow<WorkItem>(ToInternal(worker.pool).get(), worker, task);
{
SysPushErrorArg("invalid worker");
return {};
}
return AuMakeSharedThrow<WorkItem>(GetWorkerInternal(worker.pool).get(), worker, task);
} }
AUKN_SYM AuSPtr<IWorkItem> NewFence() AUKN_SYM AuSPtr<IWorkItem> NewFence()
{ {
return AuMakeShared<WorkItem>(GetWorkerInternal(), AuAsync::GetCurrentWorkerPId(), AuSPtr<IWorkItemHandler>{}); auto pWorker = GetCurrentWorkerPId().pool;
if (!pWorker) AuUnsafeRaiiToShared(gAsyncApp);
return AuMakeShared<WorkItem>((IThreadPoolInternal *)ToInternal(pWorker).get(), WorkerPId_t {}, AuSPtr<IWorkItemHandler>{});
} }
void *WorkItem::GetPrivateData() void *WorkItem::GetPrivateData()