*/
void Timer_CallTimers()
{
+ // Tick the random number generator every time timers are checked
+ rand();
+
SHORTLOCK(&gTimers_ListLock);
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 {
// Mutex_Release( &Timer->Lock ); // Prevent deadlocks
for( prev_next = &gTimers, t = gTimers; t; prev_next = &t->Next, t = t->Next )
{
- ASSERTC( *prev_next, !=, t );
+ ASSERT( prev_next != &t->Next );
ASSERT( CheckMem(t, sizeof(tTimer)) );
if( t == Timer )
{
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);
}
SHORTLOCK(&gTimers_ListLock);
for( prev_next = &gTimers, t = gTimers; t; prev_next = &t->Next, t = t->Next )
{
- ASSERT( *prev_next != t ); ASSERT( CheckMem(t, sizeof(tTimer)) );
+ ASSERT( prev_next != &t->Next );
+ ASSERT( CheckMem(t, sizeof(tTimer)) );
if( t == Timer )
{
*prev_next = t->Next;
Timer->Argument = Argument;
// memset( &Timer->Lock, 0, sizeof(Timer->Lock) );
Timer->bActive = 0;
+ LOG("Initialised timer %p (cb=%p,arg=%p)", Timer, Callback, Argument);
}
/**
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);
}