/* Local Jump */
/**************/
-typedef sigjmp_buf FOSA_LONG_JUMP_CONTEXT_T_OPAQUE;
+typedef struct {
+ sigjmp_buf setjmp_context;
+ int setjmp_retvalue;
+} FOSA_LONG_JUMP_CONTEXT_T_OPAQUE;
/* Threads and signals */
* Returns 0 if successful; otherwise it returns an error code:
* EINVAL: the value of timerid is not valid
**/
-int fosa_timer_delete(fosa_timer_id_t timerid)
+int fosa_timer_delete(fosa_timer_id_t timerid)
{
int ret;
if (context == NULL)
return FOSA_EINVAL;
- sigsetjmp(*context, 1);
+ context->setjmp_retvalue = sigsetjmp(context->setjmp_context, 1);
return 0;
}
int fosa_long_jump_was_performed(const fosa_long_jump_context_t *context,
int *jumped)
{
- return FOSA_EINVAL;
+ if (context == NULL)
+ return FOSA_EINVAL;
+
+ *jumped = context->setjmp_retvalue != 0;
+
+ return 0;
}
/**
fosa_long_jump_context_t *context =
(fosa_long_jump_context_t*) info->si_ptr;
- siglongjmp(*context, 1);
+ siglongjmp(context->setjmp_context, -1);
}
/**
int ret;
struct sigaction sa_long_jump;
+ signal = FOSA_LONG_JUMP_SIGNAL;
sa_long_jump.sa_handler = NULL;
sa_long_jump.sa_sigaction = __long_jump_handler;
sigemptyset(&sa_long_jump.sa_mask);
ret = pthread_condattr_init(&attr);
if (ret) return errno;
- ret = pthread_condattr_setclock(&attr, FOSA_CLOCK_REALTIME);
- if (ret) return errno;
-
ret = pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
if (ret) return errno;