diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/posix/src/prwlocktimedrdlock.c | 47 |
1 files changed, 8 insertions, 39 deletions
diff --git a/cpukit/posix/src/prwlocktimedrdlock.c b/cpukit/posix/src/prwlocktimedrdlock.c index a9ac13348d..47c76d9136 100644 --- a/cpukit/posix/src/prwlocktimedrdlock.c +++ b/cpukit/posix/src/prwlocktimedrdlock.c @@ -20,59 +20,28 @@ #include <rtems/posix/rwlockimpl.h> #include <rtems/posix/posixapi.h> -#include <rtems/score/todimpl.h> int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { - POSIX_RWLock_Control *the_rwlock; - Thread_queue_Context queue_context; - Watchdog_Interval ticks; - bool do_wait; - TOD_Absolute_timeout_conversion_results timeout_status; - Status_Control status; - - /* - * POSIX requires that blocking calls with timeouts that take - * an absolute timeout must ignore issues with the absolute - * time provided if the operation would otherwise succeed. - * So we check the abstime provided, and hold on to whether it - * is valid or not. If it isn't correct and in the future, - * then we do a polling operation and convert the STATUS_UNAVAILABLE - * status into the appropriate error. - * - * If the timeout status is TOD_ABSOLUTE_TIMEOUT_INVALID, - * TOD_ABSOLUTE_TIMEOUT_IS_IN_PAST, or TOD_ABSOLUTE_TIMEOUT_IS_NOW, - * then we should not wait. - */ - timeout_status = _TOD_Absolute_timeout_to_ticks( abstime, CLOCK_REALTIME, &ticks ); - do_wait = ( timeout_status == TOD_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ); + POSIX_RWLock_Control *the_rwlock; + Thread_queue_Context queue_context; + Status_Control status; the_rwlock = _POSIX_RWLock_Get( rwlock ); POSIX_RWLOCK_VALIDATE_OBJECT( the_rwlock ); _Thread_queue_Context_initialize( &queue_context ); - _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); + _Thread_queue_Context_set_enqueue_timeout_realtime_timespec( + &queue_context, + abstime + ); status = _CORE_RWLock_Seize_for_reading( &the_rwlock->RWLock, - do_wait, + true, &queue_context ); - - if ( !do_wait && status == STATUS_UNAVAILABLE ) { - if ( timeout_status == TOD_ABSOLUTE_TIMEOUT_INVALID ) { - return EINVAL; - } - - if ( - timeout_status == TOD_ABSOLUTE_TIMEOUT_IS_IN_PAST - || timeout_status == TOD_ABSOLUTE_TIMEOUT_IS_NOW - ) { - return ETIMEDOUT; - } - } - return _POSIX_Get_error( status ); } |