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