fix UnknownThreadSlot
This commit is contained in:
@@ -130,8 +130,41 @@ static int FindEmptyThreadSlot()
|
|||||||
RageException::Throw("Out of thread slots!");
|
RageException::Throw("Out of thread slots!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void InitThreads()
|
||||||
|
{
|
||||||
|
/* We don't have to worry about two threads calling this at on */
|
||||||
|
static bool bInitialized = false;
|
||||||
|
if( bInitialized )
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_ThreadSlotsLock.Lock();
|
||||||
|
|
||||||
|
/* Libraries might start threads on their own, which might call user callbacks,
|
||||||
|
* which could come back here. Make sure we don't accidentally initialize twice. */
|
||||||
|
if( bInitialized )
|
||||||
|
{
|
||||||
|
g_ThreadSlotsLock.Unlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bInitialized = true;
|
||||||
|
|
||||||
|
/* Register the "unknown thread" slot. */
|
||||||
|
int slot = FindEmptyThreadSlot();
|
||||||
|
strcpy( g_ThreadSlots[slot].name, "Unknown thread" );
|
||||||
|
g_ThreadSlots[slot].id = GetInvalidThreadId();
|
||||||
|
sprintf( g_ThreadSlots[slot].ThreadFormattedOutput, "Unknown thread" );
|
||||||
|
g_ThreadSlots[slot].used = true;
|
||||||
|
g_pUnknownThreadSlot = &g_ThreadSlots[slot];
|
||||||
|
|
||||||
|
g_ThreadSlotsLock.Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ThreadSlot *GetThreadSlotFromID( uint64_t iID )
|
static ThreadSlot *GetThreadSlotFromID( uint64_t iID )
|
||||||
{
|
{
|
||||||
|
InitThreads();
|
||||||
|
|
||||||
for( int entry = 0; entry < MAX_THREADS; ++entry )
|
for( int entry = 0; entry < MAX_THREADS; ++entry )
|
||||||
{
|
{
|
||||||
if( !g_ThreadSlots[entry].used )
|
if( !g_ThreadSlots[entry].used )
|
||||||
@@ -176,6 +209,8 @@ void RageThread::Create( int (*fn)(void *), void *data )
|
|||||||
/* Don't create a thread that's already running: */
|
/* Don't create a thread that's already running: */
|
||||||
ASSERT( m_pSlot == NULL );
|
ASSERT( m_pSlot == NULL );
|
||||||
|
|
||||||
|
InitThreads();
|
||||||
|
|
||||||
/* Lock unused slots, so nothing else uses our slot before we mark it used. */
|
/* Lock unused slots, so nothing else uses our slot before we mark it used. */
|
||||||
LockMut(g_ThreadSlotsLock);
|
LockMut(g_ThreadSlotsLock);
|
||||||
|
|
||||||
@@ -202,7 +237,8 @@ void RageThread::Create( int (*fn)(void *), void *data )
|
|||||||
g_ThreadSlots[slotno].used = true;
|
g_ThreadSlots[slotno].used = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* On startup, register the main thread's slot. */
|
/* On startup, register the main thread's slot. We do this in a static constructor,
|
||||||
|
* and not InitThreads(), to guarantee it happens in the main thread. */
|
||||||
static struct SetupMainThread
|
static struct SetupMainThread
|
||||||
{
|
{
|
||||||
SetupMainThread()
|
SetupMainThread()
|
||||||
@@ -212,24 +248,11 @@ static struct SetupMainThread
|
|||||||
strcpy( g_ThreadSlots[slot].name, "Main thread" );
|
strcpy( g_ThreadSlots[slot].name, "Main thread" );
|
||||||
sprintf( g_ThreadSlots[slot].ThreadFormattedOutput, "Thread: %s", g_ThreadSlots[slot].name );
|
sprintf( g_ThreadSlots[slot].ThreadFormattedOutput, "Thread: %s", g_ThreadSlots[slot].name );
|
||||||
g_ThreadSlots[slot].pImpl = MakeThisThread();
|
g_ThreadSlots[slot].pImpl = MakeThisThread();
|
||||||
|
g_ThreadSlots[slot].id = RageThread::GetCurrentThreadID();
|
||||||
g_ThreadSlots[slot].used = true;
|
g_ThreadSlots[slot].used = true;
|
||||||
}
|
}
|
||||||
} SetupMainThreadObj;
|
} SetupMainThreadObj;
|
||||||
|
|
||||||
/* Register the "unknown thread" slot. */
|
|
||||||
static struct SetupUnknownThread
|
|
||||||
{
|
|
||||||
SetupUnknownThread()
|
|
||||||
{
|
|
||||||
LockMut(g_ThreadSlotsLock);
|
|
||||||
int slot = FindEmptyThreadSlot();
|
|
||||||
strcpy( g_ThreadSlots[slot].name, "Unknown thread" );
|
|
||||||
g_ThreadSlots[slot].id = GetInvalidThreadId();
|
|
||||||
g_pUnknownThreadSlot = &g_ThreadSlots[slot];
|
|
||||||
sprintf( g_ThreadSlots[slot].ThreadFormattedOutput, "Unknown thread" );
|
|
||||||
g_ThreadSlots[slot].used = true;
|
|
||||||
}
|
|
||||||
} SetupUnknownThreadObj;
|
|
||||||
|
|
||||||
const char *RageThread::GetCurThreadName()
|
const char *RageThread::GetCurThreadName()
|
||||||
{
|
{
|
||||||
@@ -269,7 +292,7 @@ void RageThread::HaltAllThreads( bool Kill )
|
|||||||
{
|
{
|
||||||
if( !g_ThreadSlots[entry].used )
|
if( !g_ThreadSlots[entry].used )
|
||||||
continue;
|
continue;
|
||||||
if( ThisThreadID == g_ThreadSlots[entry].id )
|
if( ThisThreadID == g_ThreadSlots[entry].id || g_ThreadSlots[entry].pImpl == NULL )
|
||||||
continue;
|
continue;
|
||||||
g_ThreadSlots[entry].pImpl->Halt( Kill );
|
g_ThreadSlots[entry].pImpl->Halt( Kill );
|
||||||
}
|
}
|
||||||
@@ -282,7 +305,7 @@ void RageThread::ResumeAllThreads()
|
|||||||
{
|
{
|
||||||
if( !g_ThreadSlots[entry].used )
|
if( !g_ThreadSlots[entry].used )
|
||||||
continue;
|
continue;
|
||||||
if( ThisThreadID == g_ThreadSlots[entry].id )
|
if( ThisThreadID == g_ThreadSlots[entry].id || g_ThreadSlots[entry].pImpl == NULL )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
g_ThreadSlots[entry].pImpl->Resume();
|
g_ThreadSlots[entry].pImpl->Resume();
|
||||||
|
|||||||
Reference in New Issue
Block a user