diff --git a/BeefLibs/corlib/src/Internal.bf b/BeefLibs/corlib/src/Internal.bf index 166cf00f..8c7f842e 100644 --- a/BeefLibs/corlib/src/Internal.bf +++ b/BeefLibs/corlib/src/Internal.bf @@ -118,6 +118,11 @@ namespace System { sModuleHandle = handle; } + [AlwaysInclude] + static void AddRtFlags(int32 flags) + { + Runtime.[Friend]sExtraFlags |= (.)flags; + } public static T* AllocRawArrayUnmarked(int size) { diff --git a/BeefLibs/corlib/src/Runtime.bf b/BeefLibs/corlib/src/Runtime.bf index 8ded2653..d5cd3b77 100644 --- a/BeefLibs/corlib/src/Runtime.bf +++ b/BeefLibs/corlib/src/Runtime.bf @@ -279,14 +279,17 @@ namespace System ObjectHasDebugFlags = 1, LeakCheck = 2, SilentCrash = 4, - DebugAlloc = 8 + DebugAlloc = 8, + NoThreadExitWait = 0x10 } + static RtFlags sExtraFlags; + public static this() { BfRtCallbacks.sCallbacks.Init(); - RtFlags flags = default; + RtFlags flags = sExtraFlags; #if BF_ENABLE_OBJECT_DEBUG_FLAGS flags |= .ObjectHasDebugFlags; #endif diff --git a/BeefRT/rt/BfObjects.h b/BeefRT/rt/BfObjects.h index 3c064327..3569bbbc 100644 --- a/BeefRT/rt/BfObjects.h +++ b/BeefRT/rt/BfObjects.h @@ -35,7 +35,8 @@ enum BfRtFlags BfRtFlags_ObjectHasDebugFlags = 1, BfRtFlags_LeakCheck = 2, BfRtFlags_SilentCrash = 4, - BfRtFlags_DebugAlloc = 8 + BfRtFlags_DebugAlloc = 8, + BfRtFlags_NoThreadExitWait = 0x10, }; namespace bf diff --git a/BeefRT/rt/Thread.cpp b/BeefRT/rt/Thread.cpp index c87c14a9..5cf5dce8 100644 --- a/BeefRT/rt/Thread.cpp +++ b/BeefRT/rt/Thread.cpp @@ -158,7 +158,10 @@ static void BF_CALLTYPE CStartProc(void* threadParam) } void BfInternalThread::WaitForAllDone() -{ +{ + if ((gBfRtFlags & BfRtFlags_NoThreadExitWait) != 0) + return; + while (gLiveThreadCount != 0) { // Clear out any old done events diff --git a/IDE/mintest/minlib/src/System/Internal.bf b/IDE/mintest/minlib/src/System/Internal.bf index 6e52d1a0..443c7a4f 100644 --- a/IDE/mintest/minlib/src/System/Internal.bf +++ b/IDE/mintest/minlib/src/System/Internal.bf @@ -107,6 +107,11 @@ namespace System { sModuleHandle = handle; } + [AlwaysInclude] + static void AddRtFlags(int32 flags) + { + Runtime.[Friend]sExtraFlags |= (.)flags; + } public static Object ObjectAlloc(TypeInstance typeInst, int size) { diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index fc103e98..acfa2ac2 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -1634,6 +1634,8 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule) // Generate "main" if (!IsHotCompile()) { + int rtFlags = 0; + BfIRFunctionType mainFuncType; BfIRFunction mainFunc; if ((targetType == BfTargetType_BeefConsoleApplication) || (targetType == BfTargetType_BeefTest)) @@ -1656,6 +1658,7 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule) if (mOptions.mMachineType == BfMachineType_x86) bfModule->mBfIRBuilder->SetFuncCallingConv(mainFunc, BfIRCallingConv_StdCall); bfModule->SetupIRMethod(NULL, mainFunc, false); + rtFlags = 0x10; // BfRtFlags_NoThreadExitWait } else if (targetType == BfTargetType_BeefWindowsApplication) { @@ -1687,6 +1690,17 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule) auto entryBlock = bfModule->mBfIRBuilder->CreateBlock("entry", true); bfModule->mBfIRBuilder->SetInsertPoint(entryBlock); + if (rtFlags != 0) + { + auto addRtFlagMethod = bfModule->GetInternalMethod("AddRtFlags", 1); + if (addRtFlagMethod) + { + SmallVector args; + args.push_back(bfModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32, rtFlags)); + bfModule->mBfIRBuilder->CreateCall(addRtFlagMethod.mFunc, args); + } + } + if ((mOptions.mPlatformType != BfPlatformType_Windows) && ((targetType == BfTargetType_BeefConsoleApplication) || (targetType == BfTargetType_BeefTest))) { diff --git a/IDEHelper/Compiler/BfCompiler.h b/IDEHelper/Compiler/BfCompiler.h index ad0e0732..89d2f801 100644 --- a/IDEHelper/Compiler/BfCompiler.h +++ b/IDEHelper/Compiler/BfCompiler.h @@ -336,7 +336,7 @@ public: BfTypeDef* mSpanTypeDef; BfTypeDef* mBfObjectTypeDef; - BfTypeDef* mClassVDataTypeDef; + BfTypeDef* mClassVDataTypeDef; BfTypeDef* mDbgRawAllocDataTypeDef; BfTypeDef* mDeferredCallTypeDef;