1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Added NoThreadExitWait Rt option for DLLs

This commit is contained in:
Brian Fiete 2020-09-01 16:22:48 -07:00
parent 177b5b7254
commit b2ab1b1f62
7 changed files with 36 additions and 5 deletions

View file

@ -118,6 +118,11 @@ namespace System
{
sModuleHandle = handle;
}
[AlwaysInclude]
static void AddRtFlags(int32 flags)
{
Runtime.[Friend]sExtraFlags |= (.)flags;
}
public static T* AllocRawArrayUnmarked<T>(int size)
{

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)
{

View file

@ -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<BfIRValue, 1> 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)))
{

View file

@ -336,7 +336,7 @@ public:
BfTypeDef* mSpanTypeDef;
BfTypeDef* mBfObjectTypeDef;
BfTypeDef* mClassVDataTypeDef;
BfTypeDef* mClassVDataTypeDef;
BfTypeDef* mDbgRawAllocDataTypeDef;
BfTypeDef* mDeferredCallTypeDef;