Sorting source tree a bit
[tpg/acess2.git] / KernelLand / Kernel / time.c
1 /*
2  * Acess 2
3  * - By John Hodge (thePowersGang) 
4  *
5  * Timer Code
6  */
7 #include <acess.h>
8 #include <timers.h>
9 #include <events.h>
10 #include <hal_proc.h>   // Proc_GetCurThread
11
12 // === CONSTANTS ===
13 #define NUM_TIMERS      8
14
15 // === TYPEDEFS ===
16 struct sTimer {
17         tTimer  *Next;
18         Sint64  FiresAfter;
19         void    (*Callback)(void*);
20         void    *Argument;
21 };
22
23 // === PROTOTYPES ===
24 void    Timer_CallTimers(void);
25
26 // === GLOBALS ===
27 volatile Uint64 giTicks = 0;
28 volatile Sint64 giTimestamp = 0;
29 volatile Uint64 giPartMiliseconds = 0;
30 tTimer  *gTimers;       // TODO: Replace by a ring-list timer
31
32 // === CODE ===
33 /**
34  * \fn void Timer_CallTimers()
35  */
36 void Timer_CallTimers()
37 {
38         while( gTimers && gTimers->FiresAfter < now() )
39         {
40                 tTimer  *next;
41         
42                 if( gTimers->Callback )
43                         gTimers->Callback(gTimers->Argument);
44                 else
45                         Threads_PostEvent(gTimers->Argument, THREAD_EVENT_TIMER);
46                 
47                 next = gTimers->Next;
48                 free(gTimers);
49                 gTimers = next;
50         }
51 }
52
53 /**
54  * \brief Schedule an action
55  */
56 tTimer *Time_CreateTimer(int Delta, tTimerCallback *Callback, void *Argument)
57 {
58         tTimer  *ret;
59         tTimer  *t, *p;
60         
61         if(Callback == NULL)
62                 Argument = Proc_GetCurThread();
63
64         // TODO: Use a pool instead?
65         ret = malloc(sizeof(tTimer));
66         
67         ret->Callback = Callback;
68         ret->FiresAfter = now() + Delta;
69         ret->Argument = Argument;
70
71         // Add into list (sorted)
72         for( p = (tTimer*)&gTimers, t = gTimers; t; p = t, t = t->Next )
73         {
74                 if( t->FiresAfter > ret->FiresAfter )   break;
75         }
76         ret->Next = t;
77         p->Next = ret;
78
79         return ret;
80 }
81
82 /**
83  * \brief Delete a timer
84  */
85 void Time_RemoveTimer(tTimer *Timer)
86 {
87         tTimer  *t, *p;
88         for( p = (tTimer*)&gTimers, t = gTimers; t; p = t, t = t->Next )
89         {
90                 if( t == Timer )
91                 {
92                         p->Next = t->Next;
93                         free(Timer);
94                         return ;
95                 }
96         }
97 }
98
99 /**
100  * \fn void Time_Delay(int Delay)
101  * \brief Delay for a small ammount of time
102  */
103 void Time_Delay(int Delay)
104 {
105 //      tTime   dest = now() + Delay;
106 //      while(dest > now())     Threads_Yield();
107         Time_CreateTimer(Delay, NULL, NULL);
108         Threads_WaitEvents(THREAD_EVENT_TIMER);
109 }
110
111 // === EXPORTS ===
112 EXPORT(Time_CreateTimer);
113 EXPORT(Time_RemoveTimer);
114 EXPORT(Time_Delay);

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