/*** 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 optuStackSize = { 0 }, AuOptional optName = { }) { ThreadInfo threadInfo( AuMakeShared(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 optuStackSize = { 0 }, AuOptional optName = { }) { ThreadInfo threadInfo( AuMakeShared(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); } }