/* * $Id$ */ /* * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id$ */ #if HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include /*PAGE * * 11.4.4 Waiting on a Condition, P1003.1c/Draft 10, p. 105 */ int pthread_cond_timedwait( pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime ) { Watchdog_Interval timeout; struct timespec current_time; struct timespec difference; boolean already_timedout = FALSE; if ( !_Timespec_Is_valid(abstime) ) return EINVAL; /* * The abstime is a walltime. We turn it into an interval. */ _TOD_Get( ¤t_time ); /* * Make sure the timeout is in the future */ if ( _Timespec_Less_than( abstime, ¤t_time ) ) { already_timedout = TRUE; difference.tv_sec = 0; difference.tv_nsec = 0; timeout = 0; } else { _Timespec_Subtract( ¤t_time, abstime, &difference ); timeout = _Timespec_To_ticks( &difference ); } return _POSIX_Condition_variables_Wait_support( cond, mutex, timeout, already_timedout ); }