]> rtime.felk.cvut.cz Git - frescor/fosa.git/blob - src_marte/test_fosa.c
added get_remaining_time
[frescor/fosa.git] / src_marte / test_fosa.c
1 #include "fosa_threads_and_signals.h"
2 #include "fosa_clocks_and_timers.h"
3 #include "fosa_mutexes_and_condvars.h"
4 #include "fosa_app_def_sched.h"
5 #include <unistd.h>
6 #include <stdio.h>
7 #include <time.h> // for nanosleep
8
9 void * thread_code(void *arg) {
10   printf("Thread executing\n");
11   sleep(1);
12   printf("Thread terminating\n");
13   return NULL;
14 }
15
16 /////////////////////////////////////////////////////////////
17 // Simple test program for FOSA
18 //
19 // It just checks that the different functions can be called
20 // and that they return appropriate values
21 /////////////////////////////////////////////////////////////
22
23 int main () {
24
25   //////////////////////////////////
26   //  Test clock functions
27   //////////////////////////////////
28
29   printf("--------------------------------------------------\n");
30   printf("test get_time\n");
31
32   struct timespec current_time;
33   int err;
34   void * obtained;
35   fosa_clock_id_t cpu_clock;
36
37   err=fosa_clock_get_time(FOSA_CLOCK_REALTIME, &current_time);
38   printf("fosa_clock_get_time for CLOCK_REALTIME sec=%d nsec=%d err=%d\n",
39          current_time.tv_sec, current_time.tv_nsec,err);
40
41   fosa_thread_get_cputime_clock(fosa_thread_self(), &cpu_clock);
42   err=fosa_clock_get_time(cpu_clock, &current_time);
43   printf("fosa_clock_get_time for CPU-time clock sec=%d nsec=%d err=%d\n",
44          current_time.tv_sec, current_time.tv_nsec,err);
45
46
47   /////////////////////////////////////////////
48   //  Test thread ids, attributes and creation
49   ////////////////////////////////////////////
50
51
52   printf("--------------------------------------------------\n");
53   printf("test thread ids and thread creation\n");
54
55   int stsize, prio;
56
57   frsh_thread_id_t tid1=fosa_thread_self();
58   frsh_thread_id_t tid2=fosa_thread_self();
59   printf("equal thread comparison=%d\n",fosa_thread_equal(tid1,tid2));
60
61   frsh_thread_attr_t th_attr;
62
63   err=frsh_thread_attr_init(&th_attr);
64   printf("thread attributes object initialized, err=%d\n",err);
65
66   err=frsh_thread_attr_set_stacksize(&th_attr,40000);
67   printf("thread attr set stack size to 40000, err=%d\n",err);
68
69   err=frsh_thread_attr_get_stacksize(&th_attr,&stsize);
70   printf("thread attr get stack size=%d, err=%d\n",stsize,err);
71
72   err=fosa_thread_attr_set_prio(&th_attr,27);
73   printf("thread attr set prio to 27, err=%d\n",err);
74
75   err=fosa_thread_attr_get_prio(&th_attr,&prio);
76   printf("thread attr get prio=%d, err=%d\n",prio,err);
77
78   err=fosa_thread_create (&tid2, &th_attr, thread_code, NULL);
79   printf("creating thread with default attributes err=%d\n",err);
80
81   sleep(2);
82
83   err=frsh_thread_attr_destroy(&th_attr);
84   printf("thread attributes object destroyed, err=%d\n",err);
85
86   //////////////////////////////////
87   //  Test signals
88   //////////////////////////////////
89
90   printf("--------------------------------------------------\n");
91   printf("test signals\n");
92
93   frsh_signal_t received;
94   frsh_signal_info_t sigvalue,  value_received;
95   struct timespec timeout;
96   frsh_signal_t sig=FOSA_SIGNAL_MIN+1;
97   frsh_signal_t timer_sig=FOSA_SIGNAL_MIN+3;
98   frsh_signal_t siglist[2];
99
100   siglist[0]=sig;
101   siglist[1]=timer_sig;
102
103   timeout.tv_sec=1;
104   timeout.tv_nsec=0;
105
106   sigvalue.sival_int=55;
107
108   err=fosa_set_accepted_signals(siglist,2);
109   printf("two signals in set of accepted signals, err=%d\n",err);
110
111   err=fosa_signal_timedwait(siglist,1,&received,&value_received,&timeout);
112   printf("timed wait not implemented; timeoutcode=%d\n",err);
113
114   err=fosa_signal_queue(sig, sigvalue,fosa_thread_self());
115   printf("signal queued with value 55, err=%d\n",err);
116
117   err=fosa_signal_wait(siglist,1,&received, &value_received);
118   printf("timeoutcode=%d signal received=%d value=%d\n",
119          err,received,value_received.sival_int);
120
121
122   //////////////////////////////////
123   //  Test timers and signals
124   //////////////////////////////////
125
126   printf("--------------------------------------------------\n");
127   printf("test timers and signals\n");
128
129   frsh_signal_info_t timer_info;
130   fosa_timer_id_t timerid;
131   struct timespec timerval, remaining_time;
132
133   timer_info.sival_int=88;
134   timerval.tv_sec=1;
135   timerval.tv_nsec=300000000;
136
137
138   err=fosa_timer_create
139     (FOSA_CLOCK_REALTIME, timer_sig, timer_info,&timerid);
140   printf("timer created, err=%d\n",err);
141
142   err=fosa_timer_arm(timerid,false,&timerval);
143   printf("timer armed for 1.3 secs, err=%d\n",err);
144
145   fosa_clock_get_time(FOSA_CLOCK_REALTIME, &current_time);
146   printf("current time sec=%d nsec=%d\n",
147          current_time.tv_sec, current_time.tv_nsec);
148   printf("wait for timer to expire...\n");
149
150   siglist[0]=timer_sig;
151   err=fosa_signal_wait(siglist,1,&received, &value_received);
152   printf("timeoutcode=%d signal received=%d value=%d\n",
153          err,received,value_received.sival_int);
154
155   fosa_clock_get_time(FOSA_CLOCK_REALTIME, &current_time);
156   printf("current time sec=%d nsec=%d\n",
157          current_time.tv_sec, current_time.tv_nsec);
158
159   timerval.tv_sec=6;
160   timerval.tv_nsec=0;
161   err=fosa_timer_arm(timerid,false,&timerval);
162   printf("timer armed for 6 secs, err=%d\n",err);
163
164   timerval.tv_sec=1;
165   printf("sleeping 1 second\n");
166   nanosleep(&timerval, NULL);
167
168   err=fosa_timer_get_remaining_time(timerid, &remaining_time);
169   printf("timer remaining time sec=%d nsec=%d, err=%d\n",
170          remaining_time.tv_sec, remaining_time.tv_nsec, err);
171
172   printf("sleeping 1 second\n");
173   nanosleep(&timerval, NULL);
174
175   err=fosa_timer_disarm(timerid,&remaining_time);
176   printf("timer disarmed, remaining time sec=%d nsec=%d, err=%d\n",
177          remaining_time.tv_sec, remaining_time.tv_nsec, err);
178
179   err=fosa_timer_get_remaining_time(timerid, &remaining_time);
180   printf("timer remaining time after disarm (0?) sec=%d nsec=%d, err=%d\n",
181          remaining_time.tv_sec, remaining_time.tv_nsec, err);
182
183   fosa_timer_delete(timerid);
184
185
186   //////////////////////////////////
187   //  Test thread-specific data
188   //////////////////////////////////
189
190   printf("--------------------------------------------------\n");
191   printf("test thread-specific data\n");
192
193   int value=333;
194   int key;
195   frsh_thread_id_t tid=fosa_thread_self();
196
197   err=fosa_key_create(&key);
198   printf("key created=%d. err=%d\n",key,err);
199
200   fosa_thread_set_specific_data (key, tid, (void *) (&value));
201   printf("specific data set to 333. err=%d\n",err);
202
203   fosa_thread_get_specific_data (key, tid, &obtained);
204   printf("obtained thread specific data=%d\n",*((int *)obtained));
205
206
207   //////////////////////////////////
208   //  Test Priorities
209   //////////////////////////////////
210
211   printf("--------------------------------------------------\n");
212   printf("test priorities\n");
213
214
215   err=fosa_thread_set_prio(fosa_thread_self(),14);
216   printf("priority set to 14. err=%d\n",err);
217
218   err=fosa_thread_get_prio(fosa_thread_self(),&prio);
219   printf("prio=%d. err=%d\n",prio,err);
220
221
222   //////////////////////////////////
223   //  Test Mutexes
224   //////////////////////////////////
225
226   printf("--------------------------------------------------\n");
227   printf("test mutexes\n");
228
229   frsh_mutex_t lock;
230   int old;
231
232   err=fosa_mutex_init(&lock,24);
233   printf("mutex initialized with ceiling 24. err=%d\n",err);
234
235   err=fosa_mutex_set_prioceiling(&lock,24,&old);
236   printf("mutex priority ceiling changed to 24. old=%d. err=%d\n",old,err);
237
238   err=fosa_mutex_get_prioceiling(&lock,&old);
239   printf("mutex priority ceiling is=%d. err=%d\n",old,err);
240
241   err=fosa_mutex_lock(&lock);
242   printf("mutex locked. err=%d\n",err);
243
244   err=fosa_mutex_unlock(&lock);
245   printf("mutex unlocked. err=%d\n",err);
246
247   err=fosa_mutex_trylock(&lock);
248   printf("mutex try locked. err=%d\n",err);
249
250   err=fosa_mutex_unlock(&lock);
251   printf("mutex unlocked. err=%d\n",err);
252
253   //////////////////////////////////
254   //  Test Condition variables
255   //////////////////////////////////
256
257   printf("--------------------------------------------------\n");
258   printf("test condition variables\n");
259
260   fosa_cond_t cond;
261
262   err=fosa_cond_init(&cond);
263   printf("condvar initialized. err=%d\n",err);
264
265   err=fosa_cond_signal(&cond);
266   printf("cond signalled. err=%d\n",err);
267
268   err=fosa_cond_broadcast(&cond);
269   printf("cond broadcast. err=%d\n",err);
270
271   fosa_clock_get_time(FOSA_CLOCK_REALTIME, &current_time);
272   printf("current time sec=%d nsec=%d\n",
273          current_time.tv_sec, current_time.tv_nsec);
274
275   current_time.tv_sec=current_time.tv_sec+2;
276
277   fosa_mutex_lock(&lock);
278   err=fosa_cond_timedwait(&cond,&lock,&current_time);
279   fosa_mutex_unlock(&lock);
280   printf("cond timedwait with timeout=2 sec. err=%d\n",err);
281
282   fosa_clock_get_time(FOSA_CLOCK_REALTIME, &current_time);
283   printf("current time sec=%d nsec=%d\n",
284          current_time.tv_sec, current_time.tv_nsec);
285
286   err=fosa_mutex_destroy(&lock);
287   printf("mutex destroyed. err=%d\n",err);
288
289   err=fosa_cond_destroy(&cond);
290   printf("cond destroyed. err=%d\n",err);
291
292   ////////////////////////////////////////
293   //  Test Application-defined scheduling
294   ///////////////////////////////////////
295
296   printf("--------------------------------------------------\n");
297   printf("test application-defined scheduling\n");
298
299   frsh_thread_attr_t th1_attr;
300   bool is_appsched;
301
302   err=frsh_thread_attr_init(&th1_attr);
303   printf("thread attributes object initialized, err=%d\n",err);
304
305   err=fosa_thread_attr_set_appscheduled(&th1_attr,true);
306   printf("thread attr set appsched, err=%d\n",err);
307
308   err=fosa_thread_attr_get_appscheduled(&th1_attr,&is_appsched);
309   printf("thread attr get appsched=%d, err=%d\n",is_appsched,err);
310
311
312
313   return 0;
314
315 }