};
// -- Processes --
// --- Locks ---
-volatile int giThreadListLock = 0; ///\note NEVER use a heap function while locked
+tSpinlock glThreadListLock = 0; ///\note NEVER use a heap function while locked
// --- Current State ---
volatile int giNumActiveThreads = 0;
volatile int giTotalTickets = 0;
if(Num < 0) return;
if(Num > MAX_TICKETS) Num = MAX_TICKETS;
- LOCK( &giThreadListLock );
+ LOCK( &glThreadListLock );
giTotalTickets -= cur->NumTickets;
cur->NumTickets = Num;
giTotalTickets += Num;
//LOG("giTotalTickets = %i", giTotalTickets);
- RELEASE( &giThreadListLock );
+ RELEASE( &glThreadListLock );
}
/**
LOCK( &Thread->IsLocked );
// Lock thread list
- LOCK( &giThreadListLock );
+ LOCK( &glThreadListLock );
// Get previous thread on list
prev = Threads_int_GetPrev( &gActiveThreads, Thread );
// Release spinlocks
RELEASE( &Thread->IsLocked ); // Released first so that it IS released
- RELEASE( &giThreadListLock );
+ RELEASE( &glThreadListLock );
//Log("Thread %i went *hurk*", Thread->TID);
//Log_Log("Threads", "%i going to sleep", cur->TID);
// Acquire Spinlock
- LOCK( &giThreadListLock );
+ LOCK( &glThreadListLock );
// Get thread before current thread
thread = Threads_int_GetPrev( &gActiveThreads, cur );
// Don't sleep if there is a message waiting
if( cur->Messages ) {
- RELEASE( &giThreadListLock );
+ RELEASE( &glThreadListLock );
return;
}
cur->Status = THREAD_STAT_SLEEPING;
// Release Spinlock
- RELEASE( &giThreadListLock );
+ RELEASE( &glThreadListLock );
while(cur->Status != THREAD_STAT_ACTIVE) HALT();
}
case THREAD_STAT_ACTIVE: break;
case THREAD_STAT_SLEEPING:
//Log_Log("Threads", "Waking %i (%p) from sleeping", Thread->TID, Thread);
- LOCK( &giThreadListLock );
+ LOCK( &glThreadListLock );
prev = Threads_int_GetPrev(&gSleepingThreads, Thread);
prev->Next = Thread->Next; // Remove from sleeping queue
Thread->Next = gActiveThreads; // Add to active queue
giNumActiveThreads ++;
giTotalTickets += Thread->NumTickets;
Thread->Status = THREAD_STAT_ACTIVE;
- RELEASE( &giThreadListLock );
+ RELEASE( &glThreadListLock );
break;
case THREAD_STAT_WAITING:
Warning("Thread_Wake - Waiting threads are not currently supported");
*/
void Threads_AddActive(tThread *Thread)
{
- LOCK( &giThreadListLock );
+ LOCK( &glThreadListLock );
Thread->Next = gActiveThreads;
gActiveThreads = Thread;
giNumActiveThreads ++;
giTotalTickets += Thread->NumTickets;
//Log("Threads_AddActive: giNumActiveThreads = %i, giTotalTickets = %i",
// giNumActiveThreads, giTotalTickets);
- RELEASE( &giThreadListLock );
+ RELEASE( &glThreadListLock );
}
/**
int number;
if(giNumActiveThreads == 0) {
- //Log_Debug("Threads", "CPU%i has no threads to run", CPU);
return NULL;
}
// Special case: 1 thread
if(giNumActiveThreads == 1) {
- //Log_Debug("Threads", "CPU%i has only one thread %i %s",
- // CPU, gActiveThreads->TID, gActiveThreads->ThreadName);
return gActiveThreads;
}
- //Log(" Threads_GetNextToRun: giNumActiveThreads=%i,giTotalTickets=%i",
- // giNumActiveThreads, giTotalTickets);
// Get the ticket number
ticket = number = rand() % giTotalTickets;
- //Log(" Threads_GetNextToRun: ticket = %i", ticket);
-
// Find the next thread
for(thread=gActiveThreads;thread;thread=thread->Next)
{
giTotalTickets, number);
}
- //Log_Debug("Threads", "Switching CPU%i to %p (%s)",
- // CPU, thread, thread->ThreadName);
-
return thread;
}