Full implementation of FOSA long jumps.
git-svn-id: http://www.frescor.org/private/svn/frescor/fosa/trunk@1562
35b4ef3e-fd22-0410-ab77-
dab3279adceb
/* Local Jump */
/**************/
/* 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 */
/* Threads and signals */
* Returns 0 if successful; otherwise it returns an error code:
* EINVAL: the value of timerid is not valid
**/
* 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)
if (context == NULL)
return FOSA_EINVAL;
if (context == NULL)
return FOSA_EINVAL;
- sigsetjmp(*context, 1);
+ context->setjmp_retvalue = sigsetjmp(context->setjmp_context, 1);
int fosa_long_jump_was_performed(const fosa_long_jump_context_t *context,
int *jumped)
{
int fosa_long_jump_was_performed(const fosa_long_jump_context_t *context,
int *jumped)
{
+ 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;
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;
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);
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_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;
ret = pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
if (ret) return errno;