diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-02 18:25:26 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-02 18:25:26 +0000 |
commit | 98dca75bf3c7cd6692349b6a9e4f66430d90e779 (patch) | |
tree | a30b9d7d6df82e75001492a94ab2b984f80045a6 /cpukit/posix/src/condtimedwait.c | |
parent | Split the POSIX semaphore manager into multiple files. (diff) | |
download | rtems-98dca75bf3c7cd6692349b6a9e4f66430d90e779.tar.bz2 |
Split condition variables into multiple files.
Diffstat (limited to 'cpukit/posix/src/condtimedwait.c')
-rw-r--r-- | cpukit/posix/src/condtimedwait.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/cpukit/posix/src/condtimedwait.c b/cpukit/posix/src/condtimedwait.c new file mode 100644 index 0000000000..ed6d676293 --- /dev/null +++ b/cpukit/posix/src/condtimedwait.c @@ -0,0 +1,57 @@ +/* + * $Id$ + */ + +#include <pthread.h> +#include <errno.h> + +#include <rtems/system.h> +#include <rtems/score/object.h> +#include <rtems/score/states.h> +#include <rtems/score/watchdog.h> +#include <rtems/posix/cond.h> +#include <rtems/posix/time.h> +#include <rtems/posix/mutex.h> + +/*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 ( !abstime ) + return EINVAL; + + /* + * The abstime is a walltime. We turn it into an interval. + */ + + (void) clock_gettime( CLOCK_REALTIME, ¤t_time ); + + /* XXX probably some error checking should go here */ + + _POSIX_Timespec_subtract( ¤t_time, abstime, &difference ); + + if ( ( difference.tv_sec < 0 ) || ( ( difference.tv_sec == 0 ) && + ( difference.tv_nsec < 0 ) ) ) + already_timedout = TRUE; + + timeout = _POSIX_Timespec_to_interval( &difference ); + + return _POSIX_Condition_variables_Wait_support( + cond, + mutex, + timeout, + already_timedout + ); +} |