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