]> rtime.felk.cvut.cz Git - frescor/fosa.git/blob - src_partikle/tests/test_long_jump.c
4a4f7368dbe91273411532e3fe1f26b97a71ba60
[frescor/fosa.git] / src_partikle / tests / test_long_jump.c
1
2 #include <fosa_long_jump.h>
3 #include <fosa_threads_and_signals.h>
4 #include <stdio.h>
5 #include <assert.h>
6
7 void f1 (void)
8 {
9         fosa_long_jump_context_t ctx;
10         fosa_signal_t sig;
11         fosa_thread_id_t th;
12         int jmp;
13         fosa_signal_info_t ctx_info;
14         sigset_t s;
15         
16         pthread_sigmask (SIG_SETMASK, NULL, &s);
17         printf (">>> Current signal mask = 0x%x\n", (unsigned int) s.sig);
18         
19         assert (fosa_long_jump_save_context (NULL));
20         
21         printf (">>> save context\n\n");
22         if (fosa_long_jump_save_context (&ctx)) {
23                 printf ("fosa_long_jump_save_context");
24                 exit (-1);
25         }
26         
27         printf (">>> check jump performed\n\n");
28         if (fosa_long_jump_was_performed ((const fosa_long_jump_context_t *) &ctx, &jmp)) {
29                 printf ("fosa_long_jump_was_performed");
30                 exit (-2);
31         }
32         
33         if (jmp) {
34                 printf ("\t <<<< JUMPED\n\n");
35                 pthread_sigmask (SIG_SETMASK, NULL, &s);
36                 printf (">>> Current signal mask = 0x%x\n",(unsigned int) s.sig);
37                 exit (10);
38         }
39         
40         printf (">>> install handler\n\n");
41         if (fosa_long_jump_install_handler (&sig, &th)) {
42                 printf ("fosa_long_jump_install_handler()");
43                 exit (-3);
44         }
45         
46         printf ("\t signal=%d, thread=0x%x (self=0x%x)\n",  sig, (unsigned int) th, (unsigned int) fosa_thread_self());
47         
48         printf (">>> trigger a long jump using a signal\n\n");
49         ctx_info.sival_ptr = &ctx;
50         if (fosa_signal_queue (sig, ctx_info, th)) {
51                 printf ("fosa_signal_queue");
52                 exit (-4);
53         }
54 }
55
56
57 int main (void)
58 {
59   sigset_t s;
60
61   sigemptyset (&s);
62   sigaddset (&s, SIGRTMIN);
63   sigaddset (&s, SIGRTMAX);
64   pthread_sigmask (SIG_SETMASK, &s, NULL);
65
66   f1 ();
67   return 0;
68 }
69