12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #include <errno.h>
- #include <pthread.h>
- #include <time.h>
- #include "posix-timer.h"
- int
- timer_gettime (timerid, value)
- timer_t timerid;
- struct itimerspec *value;
- {
- struct timer_node *timer;
- struct timespec now, expiry;
- int retval = -1, armed = 0, valid;
- clock_t clock = 0;
- pthread_mutex_lock (&__timer_mutex);
- timer = timer_id2ptr (timerid);
- valid = timer_valid (timer);
- if (valid) {
- armed = timer->armed;
- expiry = timer->expirytime;
- clock = timer->clock;
- value->it_interval = timer->value.it_interval;
- }
- pthread_mutex_unlock (&__timer_mutex);
- if (valid)
- {
- if (armed)
- {
- clock_gettime (clock, &now);
- if (timespec_compare (&now, &expiry) < 0)
- timespec_sub (&value->it_value, &expiry, &now);
- else
- {
- value->it_value.tv_sec = 0;
- value->it_value.tv_nsec = 0;
- }
- }
- else
- {
- value->it_value.tv_sec = 0;
- value->it_value.tv_nsec = 0;
- }
- retval = 0;
- }
- else
- __set_errno (EINVAL);
- return retval;
- }
|