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"
7 #include <time.h> // for nanosleep
9 void * thread_code(void *arg) {
10 printf("Thread executing\n");
12 printf("Thread terminating\n");
16 /////////////////////////////////////////////////////////////
17 // Simple test program for FOSA
19 // It just checks that the different functions can be called
20 // and that they return appropriate values
21 /////////////////////////////////////////////////////////////
25 //////////////////////////////////
26 // Test clock functions
27 //////////////////////////////////
29 printf("--------------------------------------------------\n");
30 printf("test get_time\n");
32 struct timespec current_time;
35 fosa_clock_id_t cpu_clock;
37 err=fosa_clock_get_time(FOSA_CLOCK_REALTIME, ¤t_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);
41 fosa_thread_get_cputime_clock(fosa_thread_self(), &cpu_clock);
42 err=fosa_clock_get_time(cpu_clock, ¤t_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);
47 /////////////////////////////////////////////
48 // Test thread ids, attributes and creation
49 ////////////////////////////////////////////
52 printf("--------------------------------------------------\n");
53 printf("test thread ids and thread creation\n");
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));
61 frsh_thread_attr_t th_attr;
63 err=frsh_thread_attr_init(&th_attr);
64 printf("thread attributes object initialized, err=%d\n",err);
66 err=frsh_thread_attr_set_stacksize(&th_attr,40000);
67 printf("thread attr set stack size to 40000, err=%d\n",err);
69 err=frsh_thread_attr_get_stacksize(&th_attr,&stsize);
70 printf("thread attr get stack size=%d, err=%d\n",stsize,err);
72 err=fosa_thread_attr_set_prio(&th_attr,27);
73 printf("thread attr set prio to 27, err=%d\n",err);
75 err=fosa_thread_attr_get_prio(&th_attr,&prio);
76 printf("thread attr get prio=%d, err=%d\n",prio,err);
78 err=fosa_thread_create (&tid2, &th_attr, thread_code, NULL);
79 printf("creating thread with default attributes err=%d\n",err);
83 err=frsh_thread_attr_destroy(&th_attr);
84 printf("thread attributes object destroyed, err=%d\n",err);
86 //////////////////////////////////
88 //////////////////////////////////
90 printf("--------------------------------------------------\n");
91 printf("test signals\n");
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];
101 siglist[1]=timer_sig;
106 sigvalue.sival_int=55;
108 err=fosa_set_accepted_signals(siglist,2);
109 printf("two signals in set of accepted signals, err=%d\n",err);
111 err=fosa_signal_timedwait(siglist,1,&received,&value_received,&timeout);
112 printf("timed wait not implemented; timeoutcode=%d\n",err);
114 err=fosa_signal_queue(sig, sigvalue,fosa_thread_self());
115 printf("signal queued with value 55, err=%d\n",err);
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);
122 //////////////////////////////////
123 // Test timers and signals
124 //////////////////////////////////
126 printf("--------------------------------------------------\n");
127 printf("test timers and signals\n");
129 frsh_signal_info_t timer_info;
130 fosa_timer_id_t timerid;
131 struct timespec timerval, remaining_time;
133 timer_info.sival_int=88;
135 timerval.tv_nsec=300000000;
138 err=fosa_timer_create
139 (FOSA_CLOCK_REALTIME, timer_sig, timer_info,&timerid);
140 printf("timer created, err=%d\n",err);
142 err=fosa_timer_arm(timerid,false,&timerval);
143 printf("timer armed for 1.3 secs, err=%d\n",err);
145 fosa_clock_get_time(FOSA_CLOCK_REALTIME, ¤t_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");
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);
155 fosa_clock_get_time(FOSA_CLOCK_REALTIME, ¤t_time);
156 printf("current time sec=%d nsec=%d\n",
157 current_time.tv_sec, current_time.tv_nsec);
161 err=fosa_timer_arm(timerid,false,&timerval);
162 printf("timer armed for 6 secs, err=%d\n",err);
165 printf("sleeping 1 second\n");
166 nanosleep(&timerval, NULL);
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);
172 printf("sleeping 1 second\n");
173 nanosleep(&timerval, NULL);
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);
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);
183 fosa_timer_delete(timerid);
186 //////////////////////////////////
187 // Test thread-specific data
188 //////////////////////////////////
190 printf("--------------------------------------------------\n");
191 printf("test thread-specific data\n");
195 frsh_thread_id_t tid=fosa_thread_self();
197 err=fosa_key_create(&key);
198 printf("key created=%d. err=%d\n",key,err);
200 fosa_thread_set_specific_data (key, tid, (void *) (&value));
201 printf("specific data set to 333. err=%d\n",err);
203 fosa_thread_get_specific_data (key, tid, &obtained);
204 printf("obtained thread specific data=%d\n",*((int *)obtained));
207 //////////////////////////////////
209 //////////////////////////////////
211 printf("--------------------------------------------------\n");
212 printf("test priorities\n");
215 err=fosa_thread_set_prio(fosa_thread_self(),14);
216 printf("priority set to 14. err=%d\n",err);
218 err=fosa_thread_get_prio(fosa_thread_self(),&prio);
219 printf("prio=%d. err=%d\n",prio,err);
222 //////////////////////////////////
224 //////////////////////////////////
226 printf("--------------------------------------------------\n");
227 printf("test mutexes\n");
232 err=fosa_mutex_init(&lock,24);
233 printf("mutex initialized with ceiling 24. err=%d\n",err);
235 err=fosa_mutex_set_prioceiling(&lock,24,&old);
236 printf("mutex priority ceiling changed to 24. old=%d. err=%d\n",old,err);
238 err=fosa_mutex_get_prioceiling(&lock,&old);
239 printf("mutex priority ceiling is=%d. err=%d\n",old,err);
241 err=fosa_mutex_lock(&lock);
242 printf("mutex locked. err=%d\n",err);
244 err=fosa_mutex_unlock(&lock);
245 printf("mutex unlocked. err=%d\n",err);
247 err=fosa_mutex_trylock(&lock);
248 printf("mutex try locked. err=%d\n",err);
250 err=fosa_mutex_unlock(&lock);
251 printf("mutex unlocked. err=%d\n",err);
253 //////////////////////////////////
254 // Test Condition variables
255 //////////////////////////////////
257 printf("--------------------------------------------------\n");
258 printf("test condition variables\n");
262 err=fosa_cond_init(&cond);
263 printf("condvar initialized. err=%d\n",err);
265 err=fosa_cond_signal(&cond);
266 printf("cond signalled. err=%d\n",err);
268 err=fosa_cond_broadcast(&cond);
269 printf("cond broadcast. err=%d\n",err);
271 fosa_clock_get_time(FOSA_CLOCK_REALTIME, ¤t_time);
272 printf("current time sec=%d nsec=%d\n",
273 current_time.tv_sec, current_time.tv_nsec);
275 current_time.tv_sec=current_time.tv_sec+2;
277 fosa_mutex_lock(&lock);
278 err=fosa_cond_timedwait(&cond,&lock,¤t_time);
279 fosa_mutex_unlock(&lock);
280 printf("cond timedwait with timeout=2 sec. err=%d\n",err);
282 fosa_clock_get_time(FOSA_CLOCK_REALTIME, ¤t_time);
283 printf("current time sec=%d nsec=%d\n",
284 current_time.tv_sec, current_time.tv_nsec);
286 err=fosa_mutex_destroy(&lock);
287 printf("mutex destroyed. err=%d\n",err);
289 err=fosa_cond_destroy(&cond);
290 printf("cond destroyed. err=%d\n",err);
292 ////////////////////////////////////////
293 // Test Application-defined scheduling
294 ///////////////////////////////////////
296 printf("--------------------------------------------------\n");
297 printf("test application-defined scheduling\n");
299 frsh_thread_attr_t th1_attr;
302 err=frsh_thread_attr_init(&th1_attr);
303 printf("thread attributes object initialized, err=%d\n",err);
305 err=fosa_thread_attr_set_appscheduled(&th1_attr,true);
306 printf("thread attr set appsched, err=%d\n",err);
308 err=fosa_thread_attr_get_appscheduled(&th1_attr,&is_appsched);
309 printf("thread attr get appsched=%d, err=%d\n",is_appsched,err);