7 #define SIG_CPU_CLOCK SIGRTMIN
9 static timer_t cpu_clock_timer;
11 struct clock_handler {
13 clock_func_t *handler;
16 static struct clock_handler *handler_list;
18 static void cpu_clock_loop(int arg) {
19 struct clock_handler *ch;
26 ch = (struct clock_handler*)ch->l.next;
33 int start_clock(void) {
35 struct sigaction sigact;
39 sigact.sa_handler = cpu_clock_loop;
41 sigemptyset(&sigact.sa_mask);
43 if(sigaction(SIG_CPU_CLOCK, &sigact, NULL) == -1)
47 ret = start_cpu_clock();
52 int pause_cpu_clock(void) {
53 return 0 == timer_delete(cpu_clock_timer);
56 int start_cpu_clock(void) {
58 struct itimerspec itval;
59 int int_sec, int_nanosec;
61 sev.sigev_notify = SIGEV_SIGNAL;
62 sev.sigev_signo = SIG_CPU_CLOCK;
63 sev.sigev_value.sival_ptr = &cpu_clock_timer;
65 int_sec = CPU_CLOCK_SEC;
66 int_nanosec = CPU_CLOCK_NSEC;
67 itval.it_interval.tv_sec = int_sec;
68 itval.it_interval.tv_nsec = int_nanosec;
69 itval.it_value.tv_sec = int_sec;
70 itval.it_value.tv_nsec = int_nanosec;
72 if(timer_create(CLOCK_REALTIME, &sev, &cpu_clock_timer) == -1)
76 if(timer_settime(cpu_clock_timer, 0, &itval, NULL) == -1)
83 int register_clock_hander(clock_func_t *handler) {
84 struct clock_handler *ch;
86 ch = malloc(sizeof(struct clock_handler));
88 ch->handler = handler;
90 if (handler_list == NULL) {
94 slist_add_tail(&handler_list->l, &ch->l);
100 int register_timer(unsigned long int_sec, unsigned long int_nanosec, __sighandler_t func,
101 int signum, timer_t *timerId) {
102 struct sigaction sigact;
103 struct itimerspec itval;
108 sigact.sa_handler = func;
110 sigemptyset(&sigact.sa_mask);
112 if(sigaction(signum,&sigact,NULL) == -1)
118 itval.it_interval.tv_sec = int_sec;
119 itval.it_interval.tv_nsec = int_nanosec;
120 itval.it_value.tv_sec = int_sec;
121 itval.it_value.tv_nsec = int_nanosec;
123 sev.sigev_notify = SIGEV_SIGNAL;
124 sev.sigev_signo = signum;
125 sev.sigev_value.sival_ptr = timerId;
127 if(timer_create(CLOCK_REALTIME, &sev, timerId) == -1)
131 if(timer_settime(*timerId,0,&itval,NULL) == -1)
139 int init_clock(void) {
145 void clean_clock(void) {
146 struct clock_handler *ch = handler_list;
148 timer_delete(cpu_clock_timer);
151 struct clock_handler *pp = ch;
152 ch = (struct clock_handler*)ch->l.next;
155 dprint("clean_clock done.\n");