]> rtime.felk.cvut.cz Git - frescor/fosa.git/blobdiff - src_aquosa/fosa_long_jump.c
Bugfix in fosa_long_jump_install_handler.
[frescor/fosa.git] / src_aquosa / fosa_long_jump.c
index 829e2c7a5aeed5023322a03d4047025f3b8a94c0..74e6c10628732a89e83dec0fda18cd54f11af87a 100644 (file)
@@ -103,7 +103,7 @@ int fosa_long_jump_save_context(fosa_long_jump_context_t *context)
        if (context == NULL)
                return FOSA_EINVAL;
 
-       sigsetjmp(*context, 1);
+       context->setjmp_retvalue = sigsetjmp(context->setjmp_context, 1);
 
        return 0;
 }
@@ -132,7 +132,12 @@ int fosa_long_jump_save_context(fosa_long_jump_context_t *context)
 int fosa_long_jump_was_performed(const fosa_long_jump_context_t *context,
                                 int *jumped)
 {
-       return ENOSYS;
+       if (context == NULL)
+               return FOSA_EINVAL;
+
+       *jumped = context->setjmp_retvalue != 0;
+
+       return 0;
 }
 
 /** 
@@ -140,9 +145,10 @@ int fosa_long_jump_was_performed(const fosa_long_jump_context_t *context,
  **/
 void __long_jump_handler(int n, siginfo_t *info, void *c)
 {
-       fosa_long_jump_context_t *context = (fosa_long_jump_context_t*)info->si_ptr;
+       fosa_long_jump_context_t *context =
+               (fosa_long_jump_context_t*) info->si_ptr;
 
-       siglongjmp(*context, 1);
+       siglongjmp(context->setjmp_context, -1);
 }
 
 /**
@@ -190,15 +196,19 @@ void __long_jump_handler(int n, siginfo_t *info, void *c)
 int fosa_long_jump_install_handler(fosa_signal_t *signal,
                                   fosa_thread_id_t *handler)
 {
+       int ret;
        struct sigaction sa_long_jump;
 
+       *signal = FOSA_LONG_JUMP_SIGNAL;
+       *handler = fosa_thread_self();
+
        sa_long_jump.sa_handler = NULL;
        sa_long_jump.sa_sigaction = __long_jump_handler;
        sigemptyset(&sa_long_jump.sa_mask);
        sa_long_jump.sa_flags = SA_SIGINFO;
 
-       handler = NULL;
+       ret = sigaction(*signal, &sa_long_jump, NULL);
 
-       return sigaction(*signal, &sa_long_jump, NULL);
+       return ret ? errno : 0;
 }