/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Entrypoint.cpp Date: 2021-5-13 Author: Reece ***/ #define _AURORA_RUNTIME_BUILD_API_INTERFACES #include #include #include "RuntimeInternal.hpp" #include "Crypto.hpp" #include "Processes/Processes.hpp" #include "RNG/RNG.hpp" #include "Locale/Locale.hpp" #include "Console/Console.hpp" #include "IO/FS/FS.hpp" #include "IO/IO.hpp" #include "IO/Net/Net.hpp" #include "Hashing/Hashing.hpp" #include "Debug/Debug.hpp" #include "Async/Async.hpp" #include "HWInfo/HWInfo.hpp" #include "Telemetry/Telemetry.hpp" #include "Threading/Threads/OSThread.hpp" #include "SWInfo/SWInfo.hpp" #if defined(AURORA_PLATFORM_WIN32) #include "Extensions/Win32/DarkTheme.hpp" #endif #include "Process/Process.hpp" #include "Exit/Exit.hpp" #include "CmdLine/CmdLine.hpp" #include "Grug/Grug.hpp" #include "Threading/Sleep.hpp" #if defined(AURORA_IS_LINUX_DERIVED) void LinuxSuperSecretIOTick(); #endif namespace Aurora::IO::TLS { void TLSInit(); } static thread_local bool tlsHackIsMainThread {}; static void Init() { gRuntimeRunLevel = 1; tlsHackIsMainThread = true; #if defined(AURORA_PLATFORM_WIN32) Aurora::Extensions::Win32::InitDarkMode(); #endif Crypto::InitCrypto(); Aurora::IO::TLS::TLSInit(); Aurora::RNG::Init(); Aurora::Threading::InitSleep(); Aurora::Process::InitProcess(); Aurora::SWInfo::InitSwInfo(); Aurora::Threading::Threads::InitThreading(); Aurora::Exit::InitExit(); Aurora::IO::Net::InitNetworking(); Aurora::Console::Init(); Aurora::IO::FS::InitResources(); Aurora::IO::Init(); Aurora::Console::Init2(); Aurora::HWInfo::Init(); Aurora::Telemetry::Init(); Aurora::Grug::InitGrug(); Aurora::Debug::InitDebug(); Aurora::Locale::Init(); Aurora::CmdLine::Init(); Aurora::Processes::Init(); Aurora::Hashing::InitHashing(); Aurora::Async::InitAsync(); gRuntimeRunLevel = 2; } static void Pump() { Aurora::Console::Pump(); #if defined(AURORA_IS_LINUX_DERIVED) ::LinuxSuperSecretIOTick(); #endif } static void RuntimeLateClean(); static void Deinit() { //tlsHackIsMainThread = true; gRuntimeRunLevel = 3; Aurora::Exit::PostLevel(AuThreads::GetThread(), Aurora::Exit::ETriggerLevel::eSafeTermination); gRuntimeRunLevel = 4; Aurora::RNG::Release(); Aurora::Async::ShutdownAsync(); Aurora::Grug::DeinitGrug(); RuntimeLateClean(); } static void RuntimeLateClean() // strictly IO flushing + DeinitGrug can sometimes fail under POSIX { Aurora::Console::Exit(); Aurora::Processes::Deinit(); Aurora::Exit::DeinitExit(); Aurora::IO::Deinit(); gRuntimeRunLevel = 5; } namespace Aurora { static bool gRuntimeHasStarted {}; bool RuntimeIsMainThread() { return tlsHackIsMainThread; } AUKN_SYM void RuntimeStart(const RuntimeStartInfo &info) { gRuntimeConfig = info; if (gRuntimeHasStarted) { SysPanic("Do not nest RuntimeStart/RuntimeShutdowns. Modules should respect RuntimeHasStarted()"); } try { Init(); } catch (...) { SysPanic("A fatal error occurred during the initialization of Aurora Runtime"); } gRuntimeHasStarted = true; } AUKN_SYM bool RuntimeHasStarted() { return gRuntimeHasStarted; } AUKN_SYM void RuntimeShutdown() { gRuntimeHasStarted = false; Deinit(); } AUKN_SYM void RuntimeSysPump() { Pump(); } void RuntimeLateClean() { ::RuntimeLateClean(); } } #if defined(AURORA_PLATFORM_WIN32) BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hinstDLL); } return TRUE; } #endif