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:
parent
af783bec7e
commit
c21be1eea1
6 changed files with 69 additions and 24 deletions
|
@ -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() {}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue