Kernel/x86 - Clean up some of the task switching code (possibly a little broken)
[tpg/acess2.git] / KernelLand / Kernel / time.c
index 29d8ddb..478c41f 100644 (file)
@@ -74,20 +74,21 @@ void Timer_CallbackThread(void *Unused)
  */
 void Timer_CallTimers()
 {
+       // Tick the random number generator every time timers are checked
+       rand();
+
        SHORTLOCK(&gTimers_ListLock);
+       LOG("gTimers = %p (%lli ms)", gTimers, (gTimers ? gTimers->FiresAfter : 0));
        while( gTimers && gTimers->FiresAfter < now() )
        {
+               ASSERT( gTimers != gTimers->Next );     
                // Get timer from list
                tTimer  *timer = gTimers;
-       
-               ASSERT( gTimers != gTimers->Next );     
                gTimers = gTimers->Next;
        
                // Perform event
                if( timer->Callback ) {
                        LOG("Callback schedule %p", timer);
-                       // PROBLEM! Possibly causes rescheudle during interrupt
-//                     Mutex_Acquire( &timer->Lock );  // Released once the callback fires
                        Workqueue_AddWork(&gTimers_CallbackQueue, timer);
                }
                else {
@@ -151,7 +152,7 @@ void Time_ScheduleTimer(tTimer *Timer, int Delta)
        Timer->Next = t;
        *prev_next = Timer;
        Timer->bActive = 1;
-       LOG(" %p %p %p", prev_next, Timer, t);
+       LOG(" prev_next=%p Timer=%p next=%p", prev_next, Timer, t);
        SHORTREL(&gTimers_ListLock);
 }
 
@@ -210,6 +211,7 @@ void Time_InitTimer(tTimer *Timer, tTimerCallback *Callback, void *Argument)
        Timer->Argument = Argument;
 //     memset( &Timer->Lock, 0, sizeof(Timer->Lock) );
        Timer->bActive = 0;
+       LOG("Initialised timer %p (cb=%p,arg=%p)", Timer, Callback, Argument);
 }
 
 /**
@@ -230,15 +232,23 @@ void Time_FreeTimer(tTimer *Timer)
        LOG("%p deallocated %p", __builtin_return_address(0), Timer);
 }
 
+void Time_ScheduleEvent(int Delay)
+{
+       tTimer  *t = &Proc_GetCurThread()->ThreadTimer;
+       Time_RemoveTimer(t);
+       Time_InitTimer(t, NULL, NULL);
+       Time_ScheduleTimer(t, Delay);
+}
+
 /**
  * \fn void Time_Delay(int Delay)
  * \brief Delay for a small ammount of time
  */
 void Time_Delay(int Delay)
 {
-       tTimer  *t = &Proc_GetCurThread()->ThreadTimer;
-       Time_InitTimer(t, NULL, NULL);
-       Time_ScheduleTimer(t, Delay);
+       LOG("(%i)", Delay);
+       Threads_ClearEvent(THREAD_EVENT_TIMER);
+       Time_ScheduleEvent(Delay);
        Threads_WaitEvents(THREAD_EVENT_TIMER);
 }
 

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