From 4c64539e2eddd3744ffd03d06babf04c6ccc004e Mon Sep 17 00:00:00 2001 From: faggioli Date: Tue, 24 Feb 2009 19:44:06 +0000 Subject: [PATCH] Small changes and bugfixes in signal handling, mutexes and condition variables. Full implementation of FOSA long jumps. git-svn-id: http://www.frescor.org/private/svn/frescor/fosa/trunk@1562 35b4ef3e-fd22-0410-ab77-dab3279adceb --- include/fosa_opaque_types.h | 5 ++++- src_aquosa/fosa_clocks_and_timers.c | 2 +- src_aquosa/fosa_long_jump.c | 12 +++++++++--- src_aquosa/fosa_mutexes_and_condvars.c | 3 --- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/fosa_opaque_types.h b/include/fosa_opaque_types.h index 6a8be30..4c349d0 100644 --- a/include/fosa_opaque_types.h +++ b/include/fosa_opaque_types.h @@ -276,7 +276,10 @@ FOSA_CPP_BEGIN_DECLS /* 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 */ diff --git a/src_aquosa/fosa_clocks_and_timers.c b/src_aquosa/fosa_clocks_and_timers.c index 122d4e7..57982da 100644 --- a/src_aquosa/fosa_clocks_and_timers.c +++ b/src_aquosa/fosa_clocks_and_timers.c @@ -209,7 +209,7 @@ int fosa_timer_create(fosa_clock_id_t clockid, * 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; diff --git a/src_aquosa/fosa_long_jump.c b/src_aquosa/fosa_long_jump.c index 30e350e..e784bf9 100644 --- a/src_aquosa/fosa_long_jump.c +++ b/src_aquosa/fosa_long_jump.c @@ -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 FOSA_EINVAL; + if (context == NULL) + return FOSA_EINVAL; + + *jumped = context->setjmp_retvalue != 0; + + return 0; } /** @@ -143,7 +148,7 @@ 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; - siglongjmp(*context, 1); + siglongjmp(context->setjmp_context, -1); } /** @@ -194,6 +199,7 @@ int fosa_long_jump_install_handler(fosa_signal_t *signal, 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); diff --git a/src_aquosa/fosa_mutexes_and_condvars.c b/src_aquosa/fosa_mutexes_and_condvars.c index 889edc0..397b18c 100644 --- a/src_aquosa/fosa_mutexes_and_condvars.c +++ b/src_aquosa/fosa_mutexes_and_condvars.c @@ -235,9 +235,6 @@ int fosa_cond_init(fosa_cond_t *cond) 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; -- 2.39.2