AuroraRuntime/Include/Aurora/Threading/Threads/Spawn.hpp

64 lines
2.1 KiB
C++

/***
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: Spawn.hpp
Date: 2023-09-20
Author: Reece
***/
#pragma once
namespace Aurora::Threading::Threads
{
static ThreadUnique_t Spawn(AuVoidFunc entrypoint,
bool bDetached = false,
AuOptional<AuUInt32> optuStackSize = { 0 },
AuOptional<AuString> optName = { })
{
ThreadInfo threadInfo(
AuMakeShared<IThreadVectorsFunctional>(IThreadVectorsFunctional::OnEntry_t(std::bind(entrypoint)), IThreadVectorsFunctional::OnExit_t {}),
optuStackSize.ValueOr(0)
);
SysCheckNotNullMemory(AuTryConstruct(threadInfo.name, optName.ValueOr(AuString {})), {});
SysCheckNotNullMemory(threadInfo.callbacks, ThreadUnique_t {});
auto thread = ThreadUnique(threadInfo);
SysCheckNotNullNested(thread, ThreadUnique_t {});
SysCheckNotNullNested(thread->Run(), ThreadUnique_t {});
if (bDetached)
{
thread->Detach();
}
return AuMove(thread);
}
static ThreadUnique_t Spawn(AuVoidFunc entrypoint,
AuVoidFunc finalizer,
bool bDetached = false,
AuOptional<AuUInt32> optuStackSize = { 0 },
AuOptional<AuString> optName = { })
{
ThreadInfo threadInfo(
AuMakeShared<IThreadVectorsFunctional>(IThreadVectorsFunctional::OnEntry_t(std::bind(entrypoint)), IThreadVectorsFunctional::OnExit_t(std::bind(finalizer))),
optuStackSize.ValueOr(0)
);
SysCheckNotNullMemory(AuTryConstruct(threadInfo.name, optName.ValueOr(AuString {})), { });
SysCheckNotNullMemory(threadInfo.callbacks, ThreadUnique_t {});
auto thread = ThreadUnique(threadInfo);
SysCheckNotNullNested(thread, ThreadUnique_t {});
SysCheckNotNullNested(thread->Run(), ThreadUnique_t {});
if (bDetached)
{
thread->Detach();
}
return AuMove(thread);
}
}