11 static pthread_t cpu_thread_id;
13 struct clock_handler {
15 clock_func_t *handler;
18 static struct clock_handler *handler_list;
20 #define NANOMAX (1000000000 - 1)
22 static void* cpu_clock_loop(void* arg) {
23 struct clock_handler *ch;
24 struct timespec begin;
27 dprint("cpu clock started.\n");
33 clock_gettime(CLOCK_REALTIME, &begin);
34 //dprint("-----------------\nclock ");
39 ch = (struct clock_handler*)ch->l.next;
42 clock_gettime(CLOCK_REALTIME, &end);
43 //calcurate sleep time.
44 if (end.tv_sec < begin.tv_sec )
45 sec = LONG_MAX - begin.tv_sec + end.tv_sec + 1;
47 sec = end.tv_sec - begin.tv_sec;
49 if (end.tv_nsec < begin.tv_nsec)
50 nsec = NANOMAX - begin.tv_nsec + end.tv_nsec + 1;
52 nsec = end.tv_nsec - begin.tv_nsec;
54 //dprint("sec:%d, nsec:%d\n", sec, nsec);
55 if (sec < CPU_CLOCK_SEC || nsec < CPU_CLOCK_NSEC) {
58 ts.tv_sec = sec > CPU_CLOCK_SEC ? 0 : CPU_CLOCK_SEC - sec;
59 ts.tv_nsec = nsec > CPU_CLOCK_NSEC ? 0 : CPU_CLOCK_NSEC - nsec;
61 ret = nanosleep(&ts, NULL);
62 //dprint("sleep %d sec:%d, nsec:%d, err:%d\n", ret, ts.tv_sec, ts.tv_nsec, errno);
69 int start_clock(void) {
73 ret = pthread_attr_init(&attr);
78 ret = pthread_create(&cpu_thread_id, &attr, cpu_clock_loop, NULL);
85 static void end_loop(void) {
89 //join the running thread.
90 pthread_join(cpu_thread_id, &ret);
92 dprint("clock thread joined.\n");
96 int register_clock_hander(clock_func_t *handler) {
97 struct clock_handler *ch;
99 ch = malloc(sizeof(struct clock_handler));
101 ch->handler = handler;
103 if (handler_list == NULL) {
107 slist_add_tail(&handler_list->l, &ch->l);
112 int init_clock(void) {
118 void clean_clock(void) {
119 struct clock_handler *ch = handler_list;
124 struct clock_handler *pp = ch;
125 ch = (struct clock_handler*)ch->l.next;
128 //dprint("clean_clock done.\n");