1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48: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

@ -108,6 +108,8 @@ namespace System
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
private extern static void Init(); private extern static void Init();
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
public extern static void Disable();
[CallingConvention(.Cdecl)]
public extern static void Collect(bool async = true); public extern static void Collect(bool async = true);
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
private extern static void StopCollecting(); private extern static void StopCollecting();
@ -136,6 +138,7 @@ namespace System
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
public extern static void ExcludeThreadId(int thereadId); public extern static void ExcludeThreadId(int thereadId);
#else #else
public static void Disable() {}
public static void Collect(bool async = true) {} public static void Collect(bool async = true) {}
private static void MarkAllStaticMembers() {} private static void MarkAllStaticMembers() {}
public static void DebugDumpLeaks() {} public static void DebugDumpLeaks() {}

View file

@ -21,8 +21,9 @@ namespace System.Threading
bool mAutoDelete = true; bool mAutoDelete = true;
bool mJoinOnDelete; bool mJoinOnDelete;
bool mIsBackground;
static Monitor sMonitor = new .() ~ delete _; static Monitor sMonitor = new .() ~ DeleteAndNullify!(_);
static Event<delegate void()> sOnExit ~ _.Dispose(); static Event<delegate void()> sOnExit ~ _.Dispose();
Event<delegate void()> mOnExit ~ _.Dispose(); Event<delegate void()> mOnExit ~ _.Dispose();
@ -86,6 +87,8 @@ namespace System.Threading
thread.InformThreadNameChange(thread.mName); thread.InformThreadNameChange(thread.mName);
if (thread.mPriority != .Normal) if (thread.mPriority != .Normal)
thread.SetPriorityNative((.)thread.mPriority); thread.SetPriorityNative((.)thread.mPriority);
if (thread.mIsBackground)
thread.SetBackgroundNative(thread.mIsBackground);
int32 stackStart = 0; int32 stackStart = 0;
thread.SetStackStart((void*)&stackStart); thread.SetStackStart((void*)&stackStart);
@ -383,12 +386,15 @@ namespace System.Threading
} }
public ~this() public ~this()
{
if (sMonitor != null)
{ {
using (sMonitor.Enter()) using (sMonitor.Enter())
{ {
mOnExit(); mOnExit();
sOnExit(); sOnExit();
} }
}
if (mJoinOnDelete) if (mJoinOnDelete)
Join(); Join();
@ -403,8 +409,13 @@ namespace System.Threading
public bool IsBackground public bool IsBackground
{ {
get { return IsBackgroundNative(); } get { return mIsBackground; }
set { SetBackgroundNative(value); } set
{
mIsBackground = value;
if (mInternalThread != 0)
SetBackgroundNative(mIsBackground);
}
} }
public void SetJoinOnDelete(bool joinOnDelete) public void SetJoinOnDelete(bool joinOnDelete)

View file

@ -2180,6 +2180,12 @@ void BFGC::AddPendingThread(BfInternalThread* internalThread)
mPendingThreads.TryAdd(internalThread->mThreadId, internalThread); mPendingThreads.TryAdd(internalThread->mThreadId, internalThread);
} }
void BFGC::Disable()
{
StopCollecting();
mGracelessShutdown = true;
}
void BFGC::Shutdown() void BFGC::Shutdown()
{ {
if (mShutdown) if (mShutdown)
@ -2896,6 +2902,11 @@ void GC::RemoveStackMarkableObject(Object* obj)
gBFGC.RemoveStackMarkableObject(obj); gBFGC.RemoveStackMarkableObject(obj);
} }
void GC::Disable()
{
gBFGC.Disable();
}
void GC::Shutdown() void GC::Shutdown()
{ {
gBFGC.Shutdown(); gBFGC.Shutdown();

View file

@ -397,6 +397,7 @@ public:
void AddStackMarkableObject(bf::System::Object* obj); void AddStackMarkableObject(bf::System::Object* obj);
void RemoveStackMarkableObject(bf::System::Object* obj); void RemoveStackMarkableObject(bf::System::Object* obj);
void AddPendingThread(BfInternalThread* internalThread); void AddPendingThread(BfInternalThread* internalThread);
void Disable();
void Shutdown(); void Shutdown();
void InitDebugDump(); void InitDebugDump();
void EndDebugDump(); void EndDebugDump();
@ -474,6 +475,7 @@ namespace bf
BFRT_EXPORT static void AddPendingThread(void* internalThreadInfo); BFRT_EXPORT static void AddPendingThread(void* internalThreadInfo);
public: public:
BFRT_EXPORT static void Disable();
BFRT_EXPORT static void Shutdown(); BFRT_EXPORT static void Shutdown();
BFRT_EXPORT static void Collect(bool async); BFRT_EXPORT static void Collect(bool async);
BFRT_EXPORT static void Report(); BFRT_EXPORT static void Report();

View file

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

View file

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