char *Threads_GetName(tTID ID);
#if 0
void Threads_SetPriority(tThread *Thread, int Pri);
-tThread *Threads_CloneTCB(Uint *Err, Uint Flags);
+tThread *Threads_CloneTCB(Uint Flags);
int Threads_WaitTID(int TID, int *status);
tThread *Threads_GetThread(Uint TID);
#endif
void Threads_Exit(int TID, int Status);
void Threads_Kill(tThread *Thread, int Status);
void Threads_Yield(void);
-#endif
-void Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **ListHead, tThread **ListTail, tShortSpinlock *Lock);
-#if 0
+ int Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **ListHead, tThread **ListTail, tShortSpinlock *Lock);
void Threads_Sleep(void);
int Threads_Wake(tThread *Thread);
void Threads_AddActive(tThread *Thread);
}
}
-void Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **ListHead, tThread **ListTail, tShortSpinlock *Lock)
+int Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **ListHead, tThread **ListTail, tShortSpinlock *Lock)
{
SHORTLOCK( &glThreadListLock );
tThread *us = Threads_RemActive();
if( ListTail ) {
if(*ListTail) {
(*ListTail)->Next = us;
- *ListTail = us;
}
else {
*ListHead = us;
- *ListTail = us;
}
+ *ListTail = us;
}
else {
*ListHead = us;
// return ;
SHORTREL( &glThreadListLock );
if( Lock )
- SHORTLOCK( Lock );
+ SHORTREL( Lock );
Threads_int_WaitForStatusEnd(Status);
+ us->WaitPointer = NULL;
+ return us->RetStatus;
}
/**
}
/**
- * \return 0 Ignore
+ * \brief Gets the registered (or default, if none set) handler for a signal.
+ * \return Handler function pointer, OR NULL if no signal to be ignored
*/
void *Threads_GetSignalHandler(int SignalNum)
{
+ // TODO: Core dump
+ void *User_Signal_Core = User_Signal_Kill;
+
if( SignalNum <= 0 || SignalNum >= NSIGNALS )
return NULL;
void *ret = Proc_GetCurThread()->Process->SignalHandlers[SignalNum];
- if( !ret )
+ if( !ret || (SignalNum == SIGKILL || SignalNum == SIGSTOP) )
{
// Defaults
switch(SignalNum)
{
+ case SIGHUP:
case SIGINT:
+ ret = User_Signal_Kill;
+ break;
+ case SIGQUIT:
+ case SIGILL:
+ case SIGABRT:
+ case SIGFPE:
+ ret = User_Signal_Core;
+ break;
case SIGKILL:
+ ret = User_Signal_Kill;
+ break;
case SIGSEGV:
- case SIGHUP:
+ ret = User_Signal_Core;
+ break;
+ case SIGPIPE:
+ case SIGALRM:
+ case SIGTERM:
ret = User_Signal_Kill;
break;
default:
);
break;
case THREAD_STAT_EVENTSLEEP:
- // TODO: Event mask
+ Log(" Event Mask: %x", thread->RetStatus);
break;
case THREAD_STAT_ZOMBIE:
Log(" Return Status: %i", thread->RetStatus);