]> rtime.felk.cvut.cz Git - frescor/fosa.git/blobdiff - src_aquosa/fosa_clocks_and_timers.c
Allow for mutexes and condvars to be shared among different processes.
[frescor/fosa.git] / src_aquosa / fosa_clocks_and_timers.c
index 5adb0d6ba9fd8a29f25ed68bb01507e3f7d3e089..122d4e7102230acf3f9701a38cd17223f9883ef8 100644 (file)
@@ -88,9 +88,11 @@ int fosa_clock_get_time(fosa_clock_id_t clockid,
        struct timespec current_time_tspec;
 
        ret = clock_gettime(clockid, &current_time_tspec);
+       if (ret) return errno;
+
        *current_time = fosa_timespec_to_abs_time(current_time_tspec);
 
-       return ret;
+       return 0;
 }
 
 /**
@@ -107,13 +109,14 @@ int fosa_clock_get_time(fosa_clock_id_t clockid,
 int fosa_thread_get_cputime_clock(fosa_thread_id_t tid,
                                  fosa_clock_id_t *clockid)
 {
-       if (tid.linux_pid == tid.linux_tid) {
-               /* standard UNIX process */
-               return clock_getcpuclockid(tid.linux_pid, clockid);
-       } else {
-               /* POSIX thread */
-               return pthread_getcpuclockid(tid.pthread_id, clockid);
-       }
+       int ret;
+
+       if (tid.linux_pid == tid.linux_tid) /* standard UNIX process */
+               ret = clock_getcpuclockid(tid.linux_pid, clockid);
+       else /* POSIX thread */
+               ret = pthread_getcpuclockid(tid.pthread_id, clockid);
+
+       return ret ? errno : 0;
 }
 
 /*************************
@@ -153,13 +156,16 @@ int fosa_timer_create(fosa_clock_id_t clockid,
                      fosa_signal_info_t info,
                      fosa_timer_id_t *timerid)
 {
+       int ret;
        struct sigevent event;
 
        event.sigev_notify = SIGEV_SIGNAL;
        event.sigev_signo = signal;
        event.sigev_value = *((union sigval*) &info);
 
-       return timer_create(clockid, &event, timerid);
+       ret = timer_create(clockid, &event, timerid);
+
+       return ret ? errno : 0;
 }
 
 /**
@@ -179,6 +185,7 @@ int fosa_timer_create(fosa_clock_id_t clockid,
                                     fosa_timer_id_t *timerid,
                                     fosa_thread_id_t receiver)
 {
+       int ret;
        struct sigevent event;
 
        event.sigev_notify = SIGEV_SIGNAL;
@@ -187,7 +194,9 @@ int fosa_timer_create(fosa_clock_id_t clockid,
        event.sigev_notify = SIGEV_THREAD_ID | SIGEV_SIGNAL;
        event._sigev_un._tid = receiver.linux_tid;
 
-       return timer_create(clockid, &event, timerid);
+       ret = timer_create(clockid, &event, timerid);
+
+       return ret ? errno : 0;
 }
 
 /**
@@ -202,7 +211,11 @@ int fosa_timer_create(fosa_clock_id_t clockid,
  **/
 int fosa_timer_delete(fosa_timer_id_t  timerid)
 {
-       return timer_delete(timerid);
+       int ret;
+
+       ret = timer_delete(timerid);
+
+       return ret ? errno : 0;
 }
 
 /**
@@ -233,13 +246,16 @@ int fosa_timer_delete(fosa_timer_id_t  timerid)
  **/
 int fosa_rel_timer_arm(fosa_timer_id_t timerid, const fosa_rel_time_t *value)
 {
+       int ret;
        struct itimerspec when;
 
        /* non-periodic one shot timer */
        when.it_value = fosa_abs_time_to_timespec(*value);
        when.it_interval = zero_time;
 
-       return timer_settime(timerid, 0, &when, NULL);
+       ret = timer_settime(timerid, 0, &when, NULL);
+
+       return ret ? errno : 0;
 }
 
 
@@ -271,13 +287,16 @@ int fosa_rel_timer_arm(fosa_timer_id_t timerid, const fosa_rel_time_t *value)
  **/
 int fosa_abs_timer_arm(fosa_timer_id_t timerid, const fosa_abs_time_t *value)
 {
+       int ret;
        struct itimerspec when;
 
        /* non-periodic one shot timer */
        when.it_value = fosa_abs_time_to_timespec(*value);
        when.it_interval = zero_time;
 
-       return timer_settime(timerid, TIMER_ABSTIME, &when, NULL);
+       ret = timer_settime(timerid, TIMER_ABSTIME, &when, NULL);
+
+       return ret ? errno : 0;
 }
 
 /**
@@ -306,7 +325,7 @@ int fosa_timer_get_remaining_time(fosa_timer_id_t timerid,
        ret = timer_gettime(timerid, &time);
        *remaining_time = fosa_timespec_to_rel_time(time.it_value);
 
-       return ret;
+       return ret ? errno : 0;
 }
 
 /**
@@ -335,13 +354,15 @@ int fosa_timer_disarm(fosa_timer_id_t timerid,
                return FOSA_EINVAL;
 
        ret = timer_gettime(timerid, &time);
+       if (ret) return errno;
+
        *remaining_time = fosa_timespec_to_rel_time(time.it_value);
-       if (ret < 0)
-               return ret;
 
        time.it_value = zero_time;
        time.it_interval = zero_time;
-       
-       return timer_settime(timerid, 0, &time, NULL);
+
+       ret = timer_settime(timerid, 0, &time, NULL);
+
+       return ret ? errno : 0;
 }