]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/host/libs4c/ulut/ul_htimchk.c
Initializing repo
[can-usb1.git] / ulan / host / libs4c / ulut / ul_htimchk.c
1 #include <string.h>
2 #include <time.h>
3 #include <time.h>
4 #include <errno.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #ifndef _WIN32
8 #include <unistd.h>
9 #include <sys/time.h>
10 #include <malloc.h>
11 #else /*_WIN32*/
12 #include <malloc.h>
13 #endif /*_WIN32*/
14 #include "ul_htimer.h"
15
16 /*===========================================================*/
17 /* timing tests */
18
19 void timing_test_print(struct timeval *start, struct timeval *stop, char *s)
20 {
21   long sec, usec;
22   sec=stop->tv_sec-start->tv_sec;
23   usec=stop->tv_usec-start->tv_usec;
24   if(usec>=1000000) {
25     usec-=1000000;
26     sec++;
27   }
28   if(usec<0) {
29     usec+=1000000;
30     sec--;
31   }
32   printf("%s :\t%4ld.%06ld\n",s,sec,usec);
33 }
34
35 void timing_test(void)
36 {
37   int i, r;
38   int items_cnt=100000;
39   ul_htimer_t *items;
40   ul_htimer_t *p;
41   ul_htim_time_t cmp_time;
42   
43   struct timeval time_start, time_stop;
44
45   printf("\nRunning htimer timing test for %d items\n",items_cnt);
46   
47   items=malloc(items_cnt*sizeof(ul_htimer_t));
48   if(!items){
49     printf("malloc items failed\n");
50     return;
51   }
52   
53   for(i=0;i<items_cnt;i++){
54     ul_htimer_init_detached(&items[i]);
55     items[i].function=NULL;
56     items[i].data=i;
57     if(0){
58       ul_htimer_set_expire(&items[i],(i&~1)*500);
59     }else{
60       do{
61         r=rand();
62       }while((r>0x7fffffff)||(r<0));
63       ul_htimer_set_expire(&items[i],r);
64     }
65   }
66   cmp_time=0x7fffffff;
67       
68   gettimeofday(&time_start,NULL);
69   for(i=0;i<items_cnt;i++){
70   //for(i=items_cnt;i-->0;){
71     if(ul_htimer_add(&ul_root_htimer, items+i)<0)
72       printf("ul_htimer_add is buggy\n");
73   }
74   gettimeofday(&time_stop,NULL);
75   timing_test_print(&time_start,&time_stop,"htimer insert");
76   
77   r=0;
78   gettimeofday(&time_start,NULL);
79   for(i=0;i<items_cnt;i++){
80     if(!(p=ul_htimer_cut_expired(&ul_root_htimer, &cmp_time)))
81       printf("ul_htimer_cut_expired NULL\n");
82     else{
83       if(0){
84         if(ul_htimer_get_expire(p)<r)
85           printf("ul_htimer_cut_expired returns items in the bad order !!!!!\n");
86         r=ul_htimer_get_expire(p);
87         ul_htimer_set_expire(p,0);
88       }
89     }
90   }
91   gettimeofday(&time_stop,NULL);
92   timing_test_print(&time_start,&time_stop,"cut expired");
93
94   free(items);
95 }
96
97 /*===========================================================*/
98 /* mstimer test */
99
100 void test_htimer_fnc(unsigned long data)
101 {
102   char s[30];
103   ul_get_log_time_str(s);
104   printf("%6ld : ms %8ld real %s\n",data,ul_mstime_last,s);
105 }
106
107 int mstime_test(void)
108 {
109   int i;
110   
111   for(i=0;i<100;i++){
112     ul_htimer_t *timer;
113     /*allocate new timer*/
114     timer=malloc(sizeof(ul_htimer_t));
115     /*ensure, that timer is in detached state*/
116     ul_htimer_init_detached(timer);
117     timer->function=test_htimer_fnc;
118     timer->data=i;
119     ul_htimer_set_expire(timer,(i&~1)*500);
120     if(ul_htimer_add(&ul_root_htimer, timer)<0)
121       printf("ul_htimer_add is buggy\n");
122   }
123   
124   while(1){
125     ul_msdiff_t ms_sleep;
126     ul_mstime_update();
127     ul_htimer_run_expired(&ul_root_htimer,&ul_mstime_last);
128     ul_mstime_update();
129     ul_compute_mstime_next();
130     ms_sleep=ul_mstime_next-ul_mstime_last;
131     if(ms_sleep<0) ms_sleep=0;
132     /* we do not want to overflow usec field of timeout.tv_usec */
133     if(ms_sleep>(~(ul_mstime_t)0/2001)) ms_sleep=~(ul_mstime_t)0/2001;
134
135    #ifdef there_is_something_else_do
136     if(ul_inepoll(ul_net->ul_fd)>0){
137       int loopcnt=100;
138       do {
139       ul_net_do_rec_msg(ul_net);
140       } while((ul_inepoll(ul_net->ul_fd)>0)&&loopcnt--);
141     }else 
142    #endif /*there_is_something_else_do*/
143     {
144     #ifdef WITHOUT_SYS_SELECT
145      #ifdef _WIN32
146       if(ms_sleep>100) ms_sleep=100;
147       Sleep(ms_sleep);
148      #elif defined(UL_DRV_IN_LIB)
149       if(ms_sleep>100) ms_sleep=100;
150       usleep(ms_sleep*1000);
151      #endif /* UL_DRV_IN_LIB */
152     #else /* !WITHOUT_SYS_SELECT */
153       {
154         int ret;
155         struct timeval timeout;
156         fd_set set;
157
158         FD_ZERO (&set);
159         /*set ones for all other monitored file handles*/
160         /*FD_SET (ul_net->ul_fd, &set);*/
161         FD_SET (0, &set);
162         timeout.tv_sec = 0;
163         timeout.tv_usec = ms_sleep*1000;
164         while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
165                 &&errno==-EINTR);
166         /* printf("select %d ",ret); */
167         if(FD_ISSET(0,&set))
168         { char ch;
169           read(0,&ch,1);
170           switch(ch) {
171             case 'q' : 
172               printf("\nUser requested quit\n");
173               return 0;
174           }
175         }
176       }
177     #endif /* !WITHOUT_SYS_SELECT */
178     }
179   }
180 }
181
182
183 int main(int argc, char *argv[])
184 {
185   ul_mstime_init();
186   ul_htimer_init_queue(&ul_root_htimer);
187
188   timing_test();
189   mstime_test();
190
191   return 0;
192 }