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

Implemented IsBackground. Added GC.Disable

This commit is contained in:
Brian Fiete 2025-01-18 17:40:48 -08:00
parent af783bec7e
commit c21be1eea1
6 changed files with 69 additions and 24 deletions

View file

@ -17,6 +17,7 @@ BF_TLS_DECLSPEC Thread* Thread::sCurrentThread;
#endif
static volatile int gLiveThreadCount;
static volatile int gBackgroundThreadCount;
static Beefy::SyncEvent gThreadsDoneEvent;
#ifdef BF_PLATFORM_WINDOWS
@ -132,8 +133,12 @@ static void BF_CALLTYPE CStartProc(void* threadParam)
bool isAutoDelete = gBfRtCallbacks.Thread_IsAutoDelete(thread);
gBfRtCallbacks.Thread_ThreadProc(thread);
bool isLastThread = BfpSystem_InterlockedExchangeAdd32((uint32*)&gLiveThreadCount, -1) == 1;
if (internalThread->mIsBackground)
BfpSystem_InterlockedExchangeAdd32((uint32*)&gBackgroundThreadCount, -1);
bool isLastThread = (int32)BfpSystem_InterlockedExchangeAdd32((uint32*)&gLiveThreadCount, -1) <= gBackgroundThreadCount + 1;
//printf("Stopping thread\n");
bool wantsDelete = false;
@ -158,7 +163,7 @@ static void BF_CALLTYPE CStartProc(void* threadParam)
delete internalThread;
if (isLastThread)
gThreadsDoneEvent.Set(false);
gThreadsDoneEvent.Set(false);
//printf("Thread stopped\n");
}
@ -168,7 +173,7 @@ void BfInternalThread::WaitForAllDone()
if ((gBfRtFlags & BfRtFlags_NoThreadExitWait) != 0)
return;
while (gLiveThreadCount != 0)
while (gLiveThreadCount > gBackgroundThreadCount)
{
// Clear out any old done events
gThreadsDoneEvent.WaitFor();
@ -303,12 +308,23 @@ void Thread::InternalFinalize()
bool Thread::IsBackgroundNative()
{
return false;
auto internalThread = GetInternalThread();
if (internalThread == NULL)
return false;
return internalThread->mIsBackground;
}
void Thread::SetBackgroundNative(bool isBackground)
{
auto internalThread = GetInternalThread();
if (internalThread == NULL)
return;
if (isBackground != internalThread->mIsBackground)
{
internalThread->mIsBackground = isBackground;
BfpSystem_InterlockedExchangeAdd32((uint32*)&gBackgroundThreadCount, isBackground ? 1 : -1);
}
}
int Thread::GetThreadStateNative()

View file

@ -111,6 +111,7 @@ public:
bool mStarted;
bool mJoinOnDelete;
bool mIsManualInit;
bool mIsBackground;
BfpThread* mThreadHandle;
intptr mThreadId;
Beefy::CritSect mCritSect;
@ -126,6 +127,7 @@ public:
mIsSuspended = false;
mJoinOnDelete = true;
mIsManualInit = false;
mIsBackground = false;
mStackStart = 0;
mThreadId = 0;
}