Kernel - Replaced for(;;); in panic with HALT_CPU macro
[tpg/acess2.git] / KernelLand / Kernel / threads.c
index 50889bf..1781f69 100644 (file)
@@ -49,7 +49,7 @@ void  Threads_Delete(tThread *Thread);
 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
@@ -59,9 +59,7 @@ void  Threads_int_AddToList(tThreadList *List, tThread *Thread);
 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);
@@ -754,7 +752,7 @@ void Threads_int_WaitForStatusEnd(enum eThreadStatus Status)
        }
 }
 
-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();
@@ -768,12 +766,11 @@ void Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **
        if( ListTail ) {
                if(*ListTail) {
                        (*ListTail)->Next = us;
-                       *ListTail = us;
                }
                else {
                        *ListHead = us;
-                       *ListTail = us;
                }
+               *ListTail = us;
        }
        else {
                *ListHead = us;
@@ -783,8 +780,10 @@ void Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **
        //      return ;
        SHORTREL( &glThreadListLock );
        if( Lock )
-               SHORTLOCK( Lock );
+               SHORTREL( Lock );
        Threads_int_WaitForStatusEnd(Status);
+       us->WaitPointer = NULL;
+       return us->RetStatus;
 }
 
 /**
@@ -1116,22 +1115,41 @@ void Threads_SetSignalHandler(int SignalNum, void *Handler)
 }
 
 /**
- * \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:
@@ -1240,7 +1258,7 @@ void Threads_int_DumpThread(tThread *thread)
                        );
                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);

UCC git Repository :: git.ucc.asn.au