void Threads_ToggleTrace(int TID);
void Threads_Fault(int Num);
void Threads_SegFault(tVAddr Addr);
+void Threads_PostSignal(int SignalNum);
+ int Threads_GetPendingSignal(void);
+void Threads_SetSignalHandler(int SignalNum, void *Handler);
+void *Threads_GetSignalHandler(int SignalNum);
#if 0
int Threads_GetPID(void);
int Threads_GetTID(void);
if( IsHeap(oldname) ) free( oldname );
cur->ThreadName = strdup(NewName);
-// Log_Debug("Threads", "Thread renamed to '%s'", NewName);
+ Log_Debug("Threads", "Thread renamed to '%s'", NewName);
return 0;
}
//Threads_Exit( 0, -1 );
}
+
+void Threads_PostSignal(int SignalNum)
+{
+ tThread *cur = Proc_GetCurThread();
+ cur->PendingSignal = SignalNum;
+ Threads_PostEvent(cur, THREAD_EVENT_SIGNAL);
+}
+
+/**
+ */
+int Threads_GetPendingSignal(void)
+{
+ tThread *cur = Proc_GetCurThread();
+
+ // Atomic AND with 0 fetches and clears in one operation
+ return __sync_fetch_and_and( &cur->PendingSignal, 0 );
+}
+
+/*
+ * \brief Update the current thread's signal handler
+ */
+void Threads_SetSignalHandler(int SignalNum, void *Handler)
+{
+ if( SignalNum <= 0 || SignalNum >= NSIGNALS )
+ return ;
+ if( !MM_IsUser(Handler) )
+ return ;
+ Proc_GetCurThread()->Process->SignalHandlers[SignalNum] = Handler;
+}
+
+/**
+ * \return 0 Ignore
+ */
+void *Threads_GetSignalHandler(int SignalNum)
+{
+ if( SignalNum <= 0 || SignalNum >= NSIGNALS )
+ return NULL;
+ void *ret = Proc_GetCurThread()->Process->SignalHandlers[SignalNum];
+ if( !ret )
+ {
+ // Defaults
+ switch(SignalNum)
+ {
+ case SIGINT:
+ case SIGKILL:
+ case SIGSEGV:
+// ret = User_Signal_Kill;
+ break;
+ default:
+ ret = NULL;
+ break;
+ }
+ }
+ return ret;
+}
+
// --- Process Structure Access Functions ---
tPGID Threads_GetPGID(void)
{
void Threads_int_DumpThread(tThread *thread)
{
+ if( !thread ) {
+ Log(" %p NULL", thread);
+ return ;
+ }
+ if( !CheckMem(thread, sizeof(tThread)) ) {
+ Log(" %p INVAL", thread);
+ return ;
+ }
+ tPID pid = (thread->Process ? thread->Process->PID : -1);
+ const char *statstr = (thread->Status < sizeof(casTHREAD_STAT)/sizeof(casTHREAD_STAT[0])
+ ? casTHREAD_STAT[thread->Status] : "");
Log(" %p %i (%i) - %s (CPU %i) - %i (%s)",
- thread, thread->TID, thread->Process->PID, thread->ThreadName, thread->CurCPU,
- thread->Status, casTHREAD_STAT[thread->Status]
+ thread, thread->TID, pid, thread->ThreadName, thread->CurCPU,
+ thread->Status, statstr
);
switch(thread->Status)
{
((tSemaphore*)thread->WaitPointer)->Name
);
break;
+ case THREAD_STAT_EVENTSLEEP:
+ // TODO: Event mask
+ break;
case THREAD_STAT_ZOMBIE:
Log(" Return Status: %i", thread->RetStatus);
break;
*/
void Threads_Dump(void)
{
- tThread *thread;
-
Log("--- Thread Dump ---");
Threads_DumpActive();
Log("All Threads:");
- for(thread=gAllThreads;thread;thread=thread->GlobalNext)
+ for(tThread *thread = gAllThreads; thread; thread = thread->GlobalNext)
{
Threads_int_DumpThread(thread);
}