Kernel/x86 - Removed busy wait in MM_MapTemp
[tpg/acess2.git] / KernelLand / Kernel / time.c
index cf3370a..29d8ddb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Acess 2
+ * Acess2 Kernel
  * - By John Hodge (thePowersGang) 
  *
  * Timer Code
@@ -8,19 +8,11 @@
 #define DEBUG  0
 #include <acess.h>
 #include <timers.h>
+#include <timers_int.h>
 #include <events.h>
 #include <hal_proc.h>  // Proc_GetCurThread
 #include <workqueue.h>
-
-// === TYPEDEFS ===
-struct sTimer {
-       tTimer  *Next;
-       Sint64  FiresAfter;
-       void    (*Callback)(void*);
-       void    *Argument;
-//     tMutex  Lock;
-       BOOL    bActive;
-};
+#include <threads_int.h>       // Used to get thread timer
 
 // === PROTOTYPES ===
 void   Timer_CallbackThread(void *Unused);
@@ -49,6 +41,7 @@ tShortSpinlock        gTimers_ListLock;
 void Timer_CallbackThread(void *Unused)
 {
        Threads_SetName("Timer Callback Thread");
+       Workqueue_Init(&gTimers_CallbackQueue, "Timer Callbacks", offsetof(tTimer, Next));
 
        for(;;)
        {
@@ -124,7 +117,8 @@ tTimer *Time_CreateTimer(int Delta, tTimerCallback *Callback, void *Argument)
  */
 void Time_ScheduleTimer(tTimer *Timer, int Delta)
 {
-       tTimer  *t, *p;
+       tTimer  *t;
+       tTimer  **prev_next;
 
        // Sanity checks
        if( !Timer )    return ;
@@ -141,9 +135,10 @@ void Time_ScheduleTimer(tTimer *Timer, int Delta)
        // Add into list (sorted)
        SHORTLOCK(&gTimers_ListLock);
 //     Mutex_Release( &Timer->Lock );  // Prevent deadlocks
-       for( p = (tTimer*)&gTimers, t = gTimers; t; p = t, t = t->Next )
+       for( prev_next = &gTimers, t = gTimers; t; prev_next = &t->Next, t = t->Next )
        {
-               ASSERT( p != t ); ASSERT( CheckMem(t, sizeof(tTimer)) );
+               ASSERT( prev_next != &t->Next );
+               ASSERT( CheckMem(t, sizeof(tTimer)) );
                if( t == Timer )
                {
                        LOG("Double schedule - increasing delta");
@@ -154,9 +149,9 @@ void Time_ScheduleTimer(tTimer *Timer, int Delta)
                if( t->FiresAfter > Timer->FiresAfter ) break;
        }
        Timer->Next = t;
-       p->Next = Timer;
+       *prev_next = Timer;
        Timer->bActive = 1;
-       LOG(" %p %p %p", p, Timer, t);
+       LOG(" %p %p %p", prev_next, Timer, t);
        SHORTREL(&gTimers_ListLock);
 }
 
@@ -165,17 +160,19 @@ void Time_ScheduleTimer(tTimer *Timer, int Delta)
  */
 void Time_RemoveTimer(tTimer *Timer)
 {
-       tTimer  *t, *p;
+       tTimer  *t;
+       tTimer  **prev_next;
 
        if( !Timer )    return ;
        
        SHORTLOCK(&gTimers_ListLock);
-       for( p = (tTimer*)&gTimers, t = gTimers; t; p = t, t = t->Next )
+       for( prev_next = &gTimers, t = gTimers; t; prev_next = &t->Next, t = t->Next )
        {
-               ASSERT( p != t ); ASSERT( CheckMem(t, sizeof(tTimer)) );
+               ASSERT( prev_next != &t->Next );
+               ASSERT( CheckMem(t, sizeof(tTimer)) );
                if( t == Timer )
                {
-                       p->Next = t->Next;
+                       *prev_next = t->Next;
                        break ;
                }
        }
@@ -239,11 +236,10 @@ void Time_FreeTimer(tTimer *Timer)
  */
 void Time_Delay(int Delay)
 {
-       tTimer  *t;
-       t = Time_AllocateTimer(NULL, NULL);
+       tTimer  *t = &Proc_GetCurThread()->ThreadTimer;
+       Time_InitTimer(t, NULL, NULL);
        Time_ScheduleTimer(t, Delay);
        Threads_WaitEvents(THREAD_EVENT_TIMER);
-       Time_FreeTimer(t);
 }
 
 // === EXPORTS ===

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