// === IMPORTS ===
extern void ArchThreads_Init();
+extern void Proc_Start();
extern tThread *Proc_GetCurThread();
extern int Proc_Clone(Uint *Err, Uint Flags);
void Threads_SetTickets(int Num);
int Threads_WaitTID(int TID, int *status);
tThread *Threads_GetThread(Uint TID);
+void Threads_AddToDelete(tThread *Thread);
tThread *Threads_int_GetPrev(tThread **List, tThread *Thread);
void Threads_Exit(int TID, int Status);
void Threads_Kill(tThread *Thread, int Status);
for(;;) __asm__ __volatile__ ("hlt"); // Just yeilds
}
#endif
+
+ Proc_Start();
}
/**
*/
int Threads_WaitTID(int TID, int *status)
{
+ Threads_Dump();
+
// Any Child
if(TID == -1) {
{
case THREAD_STAT_ZOMBIE:
t->Status = THREAD_STAT_DEAD;
- *status = 0;
+ if(status) *status = 0;
+ Threads_AddToDelete( t );
break;
default:
- *status = -1;
+ if(status) *status = -1;
break;
}
return ret;
return NULL;
}
+/**
+ * \fn void Threads_AddToDelete(tThread *Thread)
+ * \brief Adds a thread to the delete queue
+ */
+void Threads_AddToDelete(tThread *Thread)
+{
+ // Add to delete queue
+ if(gDeleteThreads) {
+ Thread->Next = gDeleteThreads;
+ gDeleteThreads = Thread;
+ } else {
+ Thread->Next = NULL;
+ gDeleteThreads = Thread;
+ }
+}
+
/**
* \fn tThread *Threads_int_GetPrev(tThread *List, tThread *Thread)
* \brief Gets the previous entry in a thead linked list
if(Status == -1)
{
Thread->Status = THREAD_STAT_DEAD;
- // Add to delete queue
- if(gDeleteThreads) {
- Thread->Next = gDeleteThreads;
- gDeleteThreads = Thread;
- } else {
- Thread->Next = NULL;
- gDeleteThreads = Thread;
- }
+ Threads_AddToDelete( Thread );
} else {
Thread->Status = THREAD_STAT_ZOMBIE;
}
*/
void Threads_Yield()
{
- Proc_GetCurThread()->Quantum = 0;
+ Proc_GetCurThread()->Remaining = 0;
HALT();
}
}
}
+#if 0
+/**
+ * \fn void Threads_SetSignalHandler(int Num, void *Handler)
+ * \brief Sets the signal handler for a signal
+ */
+void Threads_SetSignalHandler(int Num, void *Handler)
+{
+ if(Num < 0 || Num >= NSIG) return;
+
+ gCurrentThread->SignalHandlers[Num] = Handler;
+}
+
+/**
+ * \fn void Threads_SendSignal(int TID, int Num)
+ */
+void Threads_SendSignal(int TID, int Num)
+{
+ tThread *thread = Proc_GetThread(TID);
+ void *handler;
+
+ if(!thread) return ;
+
+ handler = thread->SignalHandlers[Num];
+
+ // Panic?
+ if(handler == SIG_ERR) {
+ Proc_Kill(TID);
+ return ;
+ }
+ // Dump Core?
+ if(handler == -2) {
+ Proc_Kill(TID);
+ return ;
+ }
+ // Ignore?
+ if(handler == -2) return;
+
+ // Check the type and handle if the thread is already in a signal
+ if(thread->CurSignal != 0) {
+ if(Num < _SIGTYPE_FATAL)
+ Proc_Kill(TID);
+ } else {
+ while(thread->CurSignal != 0)
+ Proc_Yield();
+ }
+ }
+
+ //TODO:
+}
+#endif
+
// --- Process Structure Access Functions ---
int Threads_GetPID()
{
Log(" KStack 0x%x", thread->KernelStack);
}
}
+
+/**
+ * \fn tThread *Threads_GetNextToRun(int CPU)
+ * \brief Gets the next thread to run
+ */
+tThread *Threads_GetNextToRun(int CPU)
+{
+ tThread *thread;
+ int ticket;
+ int number;
+
+ // Special case: 1 thread
+ if(giNumActiveThreads == 1)
+ {
+ return gActiveThreads;
+ }
+
+ // Get the ticket number
+ ticket = number = rand() % giTotalTickets;
+
+ // Find the next thread
+ for(thread=gActiveThreads;thread;thread=thread->Next)
+ {
+ if(thread->NumTickets > number) break;
+ number -= thread->NumTickets;
+ }
+
+ // Error Check
+ if(thread == NULL)
+ {
+ number = 0;
+ for(thread=gActiveThreads;thread;thread=thread->Next)
+ number += thread->NumTickets;
+ Panic("Bookeeping Failed - giTotalTicketCount (%i) != true count (%i)",
+ giTotalTickets, number);
+ }
+
+ return thread;
+}