1 #include <SDL.h>
2 #include "vt100.h"
3 
4 static struct event head = { 0ULL, "(head)", NULL, NULL };
5 
cancel_event(struct event * event)6 void cancel_event (struct event *event)
7 {
8   struct event *node;
9   for (node = &head; node->next != NULL; node = node->next) {
10     if (node->next != event)
11       continue;
12     node->next = event->next;
13     event->cycles = 0;
14     return;
15   }
16 }
17 
add_event(unsigned cycles,struct event * event)18 void add_event (unsigned cycles, struct event *event)
19 {
20   struct event *node;
21 
22   if (event->cycles > 0)
23     cancel_event (event);
24 
25   event->cycles = cycles;
26 
27   for (node = &head; node->next != NULL; node = node->next) {
28     if (event->cycles > node->next->cycles) {
29       event->cycles -= node->next->cycles;
30       continue;
31     }
32     node->next->cycles -= event->cycles;
33     event->next = node->next;
34     node->next = event;
35     return;
36   }
37 
38   node->next = event;
39   event->next = NULL;
40 }
41 
events(unsigned cycles)42 void events (unsigned cycles)
43 {
44   void (*callback) (void);
45   struct event *node;
46 
47   for (node = &head; node->next != NULL;) {
48     if (cycles < node->next->cycles) {
49       node->next->cycles -= cycles;
50       return;
51     }
52 
53     callback = node->next->callback;
54     cycles -= node->next->cycles;
55     node->next->cycles = 0;
56     node->next = node->next->next;
57     callback ();
58   }
59 }
60 
print_events(FILE * f)61 void print_events (FILE *f)
62 {
63   unsigned long long cycles = 0;
64   struct event *node;
65   for (node = head.next; node != NULL; node = node->next) {
66     cycles += node->cycles;
67     fprintf (f, "%20llu %s\r\n", cycles, node->name);
68   }
69 }
70 
timer(void * arg)71 int timer (void *arg)
72 {
73   unsigned long long previous;
74   for (;;) {
75     previous = get_cycles ();
76     SDL_Delay (5000);
77     LOG (TIME, "%.0f cycles per second", (get_cycles () - previous) / 5.0);
78   }
79   return 0;
80 }
81