RCS file: /usr1/CVS/rtems/cpukit/posix/src/semtimedwait.c,v
retrieving revision 1.3
diff -u -r1.3 semtimedwait.c
|
|
|
29 | 29 | |
30 | 30 | int sem_timedwait( |
31 | 31 | sem_t *sem, |
32 | | const struct timespec *timeout |
| 32 | const struct timespec *abstime |
33 | 33 | ) |
34 | 34 | { |
35 | | return _POSIX_Semaphore_Wait_support( |
36 | | sem, |
37 | | TRUE, |
38 | | _POSIX_Timespec_to_interval( timeout ) |
39 | | ); |
| 35 | /* |
| 36 | * The abstime is a walltime. We turn it into an interval. |
| 37 | */ |
| 38 | Watchdog_Interval ticks; |
| 39 | struct timespec current_time; |
| 40 | struct timespec difference; |
| 41 | |
| 42 | /* |
| 43 | * Error check the absolute time to timeout |
| 44 | */ |
| 45 | if ( /* abstime->tv_sec < 0 || */ abstime->tv_nsec ) /* tv_sec is unsigned */ |
| 46 | return EINVAL; |
| 47 | |
| 48 | if ( abstime->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) |
| 49 | return EINVAL; |
| 50 | |
| 51 | (void) clock_gettime( CLOCK_REALTIME, ¤t_time ); |
| 52 | |
| 53 | /* |
| 54 | * Make sure the abstime is in the future |
| 55 | */ |
| 56 | if ( abstime->tv_sec < current_time.tv_sec ) |
| 57 | return EINVAL; |
| 58 | if ( (abstime->tv_sec == current_time.tv_sec) && |
| 59 | (abstime->tv_nsec <= current_time.tv_nsec) ) |
| 60 | return EINVAL; |
| 61 | |
| 62 | _POSIX_Timespec_subtract( ¤t_time, abstime, &difference ); |
| 63 | |
| 64 | ticks = _POSIX_Timespec_to_interval( &difference ); |
| 65 | |
| 66 | return _POSIX_Semaphore_Wait_support( sem, TRUE, ticks ); |
40 | 67 | } |
| 68 | |