fosa_thread_id_t th;
int jmp;
fosa_signal_info_t ctx_info;
+ sigset_t s;
+ pthread_sigmask (SIG_SETMASK, NULL, &s);
+ printf (">>> Current signal mask = 0x%x\n", (unsigned int) s.sig);
printf (">>> save context\n\n");
- if (fosa_long_jump_save_context (&ctx))
- perror ("fosa_long_jump_save_context");
+ if (fosa_long_jump_save_context (&ctx)) {
+ printf ("fosa_long_jump_save_context");
+ exit (-1);
+ }
printf (">>> check jump performed\n\n");
- if (fosa_long_jump_was_performed ((const fosa_long_jump_context_t *) &ctx, &jmp))
- perror ("fosa_long_jump_was_performed");
+ if (fosa_long_jump_was_performed ((const fosa_long_jump_context_t *) &ctx, &jmp)) {
+ printf ("fosa_long_jump_was_performed");
+ exit (-2);
+ }
if (jmp) {
printf ("\t <<<< JUMPED\n\n");
+ pthread_sigmask (SIG_SETMASK, NULL, &s);
+ printf (">>> Current signal mask = 0x%x\n",(unsigned int) s.sig);
exit (10);
}
-
+
printf (">>> install handler\n\n");
- if (fosa_long_jump_install_handler (&sig, &th))
- perror ("fosa_long_jump_install_handler()");
-
+ if (fosa_long_jump_install_handler (&sig, &th)) {
+ printf ("fosa_long_jump_install_handler()");
+ exit (-3);
+ }
+
printf ("\t signal=%d, thread=0x%x (self=0x%x)\n", sig, (unsigned int) th, (unsigned int) fosa_thread_self());
printf (">>> trigger a long jump using a signal\n\n");
ctx_info.sival_ptr = &ctx;
- if (fosa_signal_queue (sig, ctx_info, th))
- perror ("fosa_signal_queue");
-
+ if (fosa_signal_queue (sig, ctx_info, th)) {
+ printf ("fosa_signal_queue");
+ exit (-4);
+ }
}
int main (void)
{
- f1 ();
- return 0;
+ sigset_t s;
+
+ sigemptyset (&s);
+ sigaddset (&s, SIGRTMIN);
+ sigaddset (&s, SIGRTMAX);
+ pthread_sigmask (SIG_SETMASK, &s, NULL);
+
+ f1 ();
+ return 0;
}