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