]> rtime.felk.cvut.cz Git - frescor/fosa.git/commitdiff
Small changes and bugfixes in signal handling, mutexes and condition variables.
authorfaggioli <faggioli@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Tue, 24 Feb 2009 19:44:06 +0000 (19:44 +0000)
committerfaggioli <faggioli@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Tue, 24 Feb 2009 19:44:06 +0000 (19:44 +0000)
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
src_aquosa/fosa_clocks_and_timers.c
src_aquosa/fosa_long_jump.c
src_aquosa/fosa_mutexes_and_condvars.c

index 6a8be30d55072a3bf8c1dab30866e8537d737148..4c349d0b9bbdcd7819a39dc131f4d5e91f63ac78 100644 (file)
@@ -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 */
index 122d4e7102230acf3f9701a38cd17223f9883ef8..57982daa3fa6fe7158cd9eb231a1916ea4bd89ef 100644 (file)
@@ -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;
 
index 30e350e96d949fb166e67766ac7037d1f8826848..e784bf9961e02c1647dc909ce62bf15ef5109fe5 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 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);
index 889edc031cf000a21a10a87c131a2f0936f8883c..397b18c3a45b68c8eef659ad793822162b856de1 100644 (file)
@@ -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;