// === PROTOTYPES ===
void Threads_Init();
void Threads_SetName(char *NewName);
+char *Threads_GetName(int ID);
void Threads_SetTickets(int Num);
int Threads_WaitTID(int TID, int *status);
tThread *Threads_GetThread(Uint TID);
void Threads_Yield();
void Threads_Sleep();
void Threads_Wake(tThread *Thread);
+void Threads_AddActive(tThread *Thread);
int Threads_GetPID();
int Threads_GetTID();
int Threads_GetUID();
cur->ThreadName = "Idle Thread";
Threads_SetTickets(0); // Never called randomly
cur->Quantum = 1; // 1 slice quantum
- for(;;) __asm__ __volatile__ ("hlt"); // Just yeilds
+ HALT();
+ for(;;) {
+ HALT(); // Just yeilds
+ }
}
#endif
strcpy(cur->ThreadName, NewName);
}
+/**
+ * \fn char *Threads_GetName(int ID)
+ * \brief Gets a thread's name
+ */
+char *Threads_GetName(int ID)
+{
+ if(ID == -1) {
+ return Proc_GetCurThread()->ThreadName;
+ }
+ return NULL;
+}
+
/**
* \fn void Threads_SetTickets(int Num)
* \brief Sets the 'priority' of a task
* \brief Wait for a task to change state
*/
int Threads_WaitTID(int TID, int *status)
-{
+{
// Any Child
if(TID == -1) {
*/
void Threads_Exit(int TID, int Status)
{
- Threads_Kill( Proc_GetCurThread(), (Uint)Status & 0xFF );
+ if( TID == 0 )
+ Threads_Kill( Proc_GetCurThread(), (Uint)Status & 0xFF );
+ else
+ Threads_Kill( Threads_GetThread(TID), (Uint)Status & 0xFF );
}
/**
child;
child = child->Next)
{
- if(child->PTID == gCurrentThread->TID)
+ if(child->PTID == Thread->TID)
Threads_Kill(child, -1);
}
}
*/
void Threads_Yield()
{
- Proc_GetCurThread()->Quantum = 0;
+ Proc_GetCurThread()->Remaining = 0;
HALT();
}
tThread *cur = Proc_GetCurThread();
tThread *thread;
- //Log("Proc_Sleep: %i going to sleep", gCurrentThread->TID);
+ Log("Proc_Sleep: %i going to sleep", cur->TID);
// Acquire Spinlock
LOCK( &giThreadListLock );
}
}
+/**
+ * \fn void Threads_AddActive(tThread *Thread)
+ * \brief Adds a thread to the active queue
+ */
+void Threads_AddActive(tThread *Thread)
+{
+ LOCK( &giThreadListLock );
+ Thread->Next = gActiveThreads;
+ gActiveThreads = Thread;
+ giNumActiveThreads ++;
+ giTotalTickets += Thread->NumTickets;
+ //Log("Threads_AddActive: giNumActiveThreads = %i, giTotalTickets = %i",
+ // giNumActiveThreads, giTotalTickets);
+ RELEASE( &giThreadListLock );
+}
+
#if 0
/**
* \fn void Threads_SetSignalHandler(int Num, void *Handler)
/**
* \fn void Threads_SendSignal(int TID, int Num)
+ * \brief Send a signal to a thread
*/
void Threads_SendSignal(int TID, int Num)
{
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)
{
return thread;
}
+
+/**
+ * \fn void Threads_SegFault(tVAddr Addr)
+ * \brief Called when a Segment Fault occurs
+ */
+void Threads_SegFault(tVAddr Addr)
+{
+ //Threads_SendSignal( Proc_GetCurThread()->TID, SIGSEGV );
+ Log("Thread #%i committed a segfault at address %p\n", Proc_GetCurThread()->TID, Addr);
+ Threads_Exit( 0, 0 );
+}