Просмотр исходного кода

Added NoThreadExitWait Rt option for DLLs

Brian Fiete 5 лет назад
Родитель
Сommit
b2ab1b1f62

+ 5 - 0
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<T>(int size)
 		{

+ 5 - 2
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

+ 2 - 1
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

+ 4 - 1
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

+ 5 - 0
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)
 		{

+ 14 - 0
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<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)))
         {

+ 1 - 1
IDEHelper/Compiler/BfCompiler.h

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