diff options
Diffstat (limited to '')
39 files changed, 645 insertions, 334 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index f158538554..8102018513 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,33 @@ +2007-04-05 Joel Sherrill <joel@OARcorp.com> + + * posix/Makefile.am, posix/include/rtems/posix/time.h, + posix/src/adjtime.c, posix/src/alarm.c, posix/src/clockgetres.c, + posix/src/condtimedwait.c, posix/src/mqueuetimedreceive.c, + posix/src/mqueuetimedsend.c, posix/src/mutextimedlock.c, + posix/src/nanosleep.c, posix/src/posixtimespecabsolutetimeout.c, + posix/src/pthread.c, posix/src/pthreadcreate.c, + posix/src/pthreadsetschedparam.c, posix/src/ptimer1.c, + posix/src/sched.c, posix/src/semtimedwait.c, + posix/src/sigtimedwait.c, posix/src/ualarm.c, + rtems/src/clocktodtoseconds.c, score/Makefile.am, + score/preinstall.am, score/include/rtems/score/tod.h, + score/inline/rtems/score/tod.inl, score/src/coretod.c, + score/src/coretodget.c, score/src/coretodgetuptime.c, + score/src/coretodset.c, score/src/coretodtickle.c: Provide timespec + manipulation routines in the SuperCore. Use them everywhere possible. + This lead to significant cleanup in the API routines and eliminated + some of the same code from the POSIX API. At this point, the + SuperCore keeps time in POSIX timespec format properly from 1970. You + just cannot set it before 1988 in keeping with RTEMS traditional + behavior. + * score/include/rtems/score/timespec.h, score/src/timespecaddto.c, + score/src/timespecfromticks.c, score/src/timespecisvalid.c, + score/src/timespeclessthan.c, score/src/timespecsubtract.c, + score/src/timespectoticks.c: New files. + * posix/src/posixintervaltotimespec.c, + posix/src/posixtimespecsubtract.c, + posix/src/posixtimespectointerval.c: Removed. + 2007-04-04 Joel Sherrill <joel@OARcorp.com> * score/Makefile.am, score/include/rtems/score/tod.h, diff --git a/cpukit/posix/Makefile.am b/cpukit/posix/Makefile.am index 271925d97a..df21ab3fd4 100644 --- a/cpukit/posix/Makefile.am +++ b/cpukit/posix/Makefile.am @@ -144,8 +144,7 @@ libposix_a_SOURCES += src/pspin.c src/pspindestroy.c src/pspininit.c \ src/pspinunlock.c ## TIME_C_FILES -libposix_a_SOURCES += src/adjtime.c src/posixtimespecsubtract.c \ - src/posixtimespectointerval.c src/posixintervaltotimespec.c \ +libposix_a_SOURCES += src/adjtime.c \ src/posixtimespecabsolutetimeout.c src/clockgetcpuclockid.c \ src/clockgetenableattr.c src/clockgetres.c src/clockgettime.c \ src/clocksetenableattr.c src/clocksettime.c src/nanosleep.c src/sleep.c \ diff --git a/cpukit/posix/include/rtems/posix/time.h b/cpukit/posix/include/rtems/posix/time.h index 09a60aa428..8f4d4b6257 100644 --- a/cpukit/posix/include/rtems/posix/time.h +++ b/cpukit/posix/include/rtems/posix/time.h @@ -3,7 +3,12 @@ */ /* + * 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$ */ @@ -11,43 +16,7 @@ #ifndef _RTEMS_POSIX_TIME_H #define _RTEMS_POSIX_TIME_H -#include <rtems/score/tod.h> - -/* - * Seconds from January 1, 1970 to January 1, 1988. Used to account for - * differences between POSIX API and RTEMS core. - * - * XXX probably able to be removed once core switches completely to timespec - * XXX for current TOD. - */ -#define POSIX_TIME_SECONDS_1970_THROUGH_1988 TOD_SECONDS_1970_THROUGH_1988 - -/* - * _POSIX_Timespec_subtract - */ - -void _POSIX_Timespec_subtract( - const struct timespec *the_start, - const struct timespec *end, - struct timespec *result -); - -/* - * _POSIX_Timespec_to_interval - */ - -Watchdog_Interval _POSIX_Timespec_to_interval( - const struct timespec *time -); - -/* - * _POSIX_Interval_to_timespec - */ - -void _POSIX_Interval_to_timespec( - Watchdog_Interval ticks, - struct timespec *time -); +#include <rtems/score/timespec.h> /* * _POSIX_Absolute_timeout_to_ticks diff --git a/cpukit/posix/src/adjtime.c b/cpukit/posix/src/adjtime.c index 1e06dab608..e8743181aa 100644 --- a/cpukit/posix/src/adjtime.c +++ b/cpukit/posix/src/adjtime.c @@ -1,8 +1,17 @@ /* - * adjustime() function - required by NTP + * adjime() function - required by NTP * * I am unaware of the history behind the definition of this service * and don't know if its behavior is covered by any standard. --joel + */ + +/* + * 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$ */ @@ -32,16 +41,19 @@ int adjtime ( struct timeval *delta, struct timeval *olddelta ) if ( !delta ) return -1; - __adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND) + delta->tv_usec; + /* convert delta to microseconds */ + __adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND); + __adjustment += delta->tv_usec; + /* too small to account for */ if ( __adjustment < _TOD_Microseconds_per_tick ) return 0; - clock_gettime( CLOCK_REALTIME, &ts ); + /* Grab the current TOD */ + _TOD_Get( &ts ); - ts.tv_sec += (__adjustment / TOD_MICROSECONDS_PER_SECOND); - ts.tv_nsec += (__adjustment % TOD_MICROSECONDS_PER_SECOND) * - TOD_NANOSECONDS_PER_MICROSECOND; + ts.tv_sec += delta->tv_sec; + ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; /* if adjustment is too much positive */ while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { @@ -55,6 +67,6 @@ int adjtime ( struct timeval *delta, struct timeval *olddelta ) ts.tv_sec--; } - clock_settime( CLOCK_REALTIME, &ts ); + _TOD_Set( &ts ); return 0; } diff --git a/cpukit/posix/src/alarm.c b/cpukit/posix/src/alarm.c index 71097554c7..1f3151b919 100644 --- a/cpukit/posix/src/alarm.c +++ b/cpukit/posix/src/alarm.c @@ -1,7 +1,8 @@ /* * 3.4.1 Schedule Alarm, P1003.1b-1993, p. 79 - * - * COPYRIGHT (c) 1989-1999. + */ + +/* COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -16,7 +17,6 @@ #endif #include <pthread.h> -/* #include <errno.h> */ #include <rtems/system.h> #include <rtems/posix/pthread.h> @@ -69,12 +69,9 @@ unsigned int alarm( * this. */ - remaining = the_timer->initial; - remaining -= (the_timer->stop_time - the_timer->start_time); - - /* remaining is now in ticks */ - remaining *= _TOD_Microseconds_per_tick; - remaining /= TOD_MICROSECONDS_PER_SECOND; + remaining = the_timer->initial - + ((the_timer->stop_time - the_timer->start_time) / + TOD_TICKS_PER_SECOND); break; } } diff --git a/cpukit/posix/src/clockgetres.c b/cpukit/posix/src/clockgetres.c index 936e35ab74..9c5f1be925 100644 --- a/cpukit/posix/src/clockgetres.c +++ b/cpukit/posix/src/clockgetres.c @@ -2,6 +2,17 @@ * $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 @@ -42,7 +53,7 @@ int clock_getres( if ( res ) { res->tv_sec = _TOD_Microseconds_per_tick / 1000000; res->tv_nsec = _TOD_Microseconds_per_tick * 1000; - /* _POSIX_Interval_to_timespec( _TOD_Microseconds_per_tick, res ); */ + /* _TOD_From_ticks( _TOD_Microseconds_per_tick, res ); */ } break; diff --git a/cpukit/posix/src/condtimedwait.c b/cpukit/posix/src/condtimedwait.c index 32ce1d4a05..717851a8c8 100644 --- a/cpukit/posix/src/condtimedwait.c +++ b/cpukit/posix/src/condtimedwait.c @@ -2,6 +2,17 @@ * $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 @@ -33,24 +44,27 @@ int pthread_cond_timedwait( struct timespec difference; boolean already_timedout = FALSE; - if ( !abstime ) + if ( !_Timespec_Is_valid(abstime) ) return EINVAL; /* * The abstime is a walltime. We turn it into an interval. */ - (void) clock_gettime( CLOCK_REALTIME, ¤t_time ); + _TOD_Get( ¤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 ) ) ) + /* + * Make sure the timeout is in the future + */ + if ( _Timespec_Less_than( abstime, ¤t_time ) ) { already_timedout = TRUE; - - timeout = _POSIX_Timespec_to_interval( &difference ); + 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, diff --git a/cpukit/posix/src/mqueuetimedreceive.c b/cpukit/posix/src/mqueuetimedreceive.c index 2ad5f4c6d6..493ac7aa66 100644 --- a/cpukit/posix/src/mqueuetimedreceive.c +++ b/cpukit/posix/src/mqueuetimedreceive.c @@ -10,6 +10,15 @@ * * This code ignores the O_RDONLY/O_WRONLY/O_RDWR flag at open * time. + */ + +/* + * 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$ */ @@ -52,6 +61,6 @@ ssize_t mq_timedreceive( msg_ptr, msg_len, msg_prio, - _POSIX_Timespec_to_interval( timeout ) + _Timespec_To_ticks( timeout ) ); } diff --git a/cpukit/posix/src/mqueuetimedsend.c b/cpukit/posix/src/mqueuetimedsend.c index 89569368be..262bf8baa9 100644 --- a/cpukit/posix/src/mqueuetimedsend.c +++ b/cpukit/posix/src/mqueuetimedsend.c @@ -10,6 +10,15 @@ * * This code ignores the O_RDONLY/O_WRONLY/O_RDWR flag at open * time. + */ + +/* + * 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$ */ @@ -52,6 +61,6 @@ int mq_timedsend( msg_ptr, msg_len, msg_prio, - _POSIX_Timespec_to_interval( timeout ) + _Timespec_To_ticks( timeout ) ); } diff --git a/cpukit/posix/src/mutextimedlock.c b/cpukit/posix/src/mutextimedlock.c index e86c3040dd..85a1782114 100644 --- a/cpukit/posix/src/mutextimedlock.c +++ b/cpukit/posix/src/mutextimedlock.c @@ -1,4 +1,15 @@ /* + * Mutex Timed Lock + */ + +/* + * 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$ */ @@ -31,9 +42,10 @@ int pthread_mutex_timedlock( const struct timespec *timeout ) { + /* XXX does timeout need to be based on CLOCK_REALTIME and be TOD? */ return _POSIX_Mutex_Lock_support( mutex, TRUE, - _POSIX_Timespec_to_interval( timeout ) + _Timespec_To_ticks( timeout ) ); } diff --git a/cpukit/posix/src/nanosleep.c b/cpukit/posix/src/nanosleep.c index 47f7cbad0e..bca61ad709 100644 --- a/cpukit/posix/src/nanosleep.c +++ b/cpukit/posix/src/nanosleep.c @@ -1,4 +1,11 @@ /* + * 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$ */ @@ -28,41 +35,25 @@ int nanosleep( ) { Watchdog_Interval ticks; - struct timespec *the_rqtp; - if ( !rqtp ) + if ( !_Timespec_Is_valid( rqtp ) ) rtems_set_errno_and_return_minus_one( EINVAL ); - the_rqtp = (struct timespec *)rqtp; - /* - * Return EAGAIN if the delay interval is negative. + * Return EINVAL if the delay interval is negative. * * NOTE: This behavior is beyond the POSIX specification. - * FSU pthreads shares this behavior. + * FSU and GNU/Linux pthreads shares this behavior. */ - - if ( the_rqtp->tv_sec < 0 ) - the_rqtp->tv_sec = 0; - - if ( /* the_rqtp->tv_sec < 0 || */ the_rqtp->tv_nsec < 0 ) - rtems_set_errno_and_return_minus_one( EAGAIN ); - - if ( the_rqtp->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) + if ( rqtp->tv_sec < 0 || rqtp->tv_nsec < 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); - ticks = _POSIX_Timespec_to_interval( the_rqtp ); - - /* - * Bump the ticks by one so the delay is at least the number of - * ticks requested - */ - ticks++; + ticks = _Timespec_To_ticks( rqtp ); /* * A nanosleep for zero time is implemented as a yield. * This behavior is also beyond the POSIX specification but is - * consistent with the RTEMS api and yields desirable behavior. + * consistent with the RTEMS API and yields desirable behavior. */ if ( !ticks ) { @@ -99,7 +90,7 @@ int nanosleep( ticks -= _Thread_Executing->Timer.stop_time - _Thread_Executing->Timer.start_time; - _POSIX_Interval_to_timespec( ticks, rmtp ); + _Timespec_From_ticks( ticks, rmtp ); /* * If there is time remaining, then we were interrupted by a signal. diff --git a/cpukit/posix/src/posixtimespecabsolutetimeout.c b/cpukit/posix/src/posixtimespecabsolutetimeout.c index df70c90533..52208e380b 100644 --- a/cpukit/posix/src/posixtimespecabsolutetimeout.c +++ b/cpukit/posix/src/posixtimespecabsolutetimeout.c @@ -1,5 +1,14 @@ /* * Convert abstime timeout to ticks + */ + +/* + * 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$ */ @@ -30,39 +39,23 @@ int _POSIX_Absolute_timeout_to_ticks( Watchdog_Interval *ticks_out ) { - struct timespec current_time; - struct timespec difference; - - if ( !abstime ) - return EINVAL; + struct timespec current_time; + struct timespec difference; - /* - * Error check the absolute time to timeout - */ -#if 0 - /* they are unsigned so this is impossible */ - if ( abstime->tv_sec < 0 || abstime->tv_nsec < 0 ) + if ( !_Timespec_Is_valid(abstime) ) return EINVAL; -#endif - if ( abstime->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) - return EINVAL; - - (void) clock_gettime( CLOCK_REALTIME, ¤t_time ); + _TOD_Get( ¤t_time ); /* * Make sure the abstime is in the future */ - if ( abstime->tv_sec < current_time.tv_sec ) - return EINVAL; - - if ( (abstime->tv_sec == current_time.tv_sec) && - (abstime->tv_nsec <= current_time.tv_nsec) ) + if ( _Timespec_Less_than( abstime, ¤t_time ) ) return EINVAL; - _POSIX_Timespec_subtract( ¤t_time, abstime, &difference ); + _Timespec_Subtract( ¤t_time, abstime, &difference ); - *ticks_out = _POSIX_Timespec_to_interval( &difference ); + *ticks_out = _Timespec_To_ticks( &difference ); return 0; } diff --git a/cpukit/posix/src/posixtimespecsubtract.c b/cpukit/posix/src/posixtimespecsubtract.c deleted file mode 100644 index a2cce2a332..0000000000 --- a/cpukit/posix/src/posixtimespecsubtract.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * $Id$ - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <time.h> -#include <errno.h> - -#include <rtems/system.h> -#include <rtems/score/isr.h> -#include <rtems/score/thread.h> -#include <rtems/score/tod.h> - -#include <rtems/seterr.h> -#include <rtems/posix/time.h> - -/*PAGE - * - * _POSIX_Timespec_subtract - */ - -void _POSIX_Timespec_subtract( - const struct timespec *start, - const struct timespec *end, - struct timespec *result -) -{ -#if 0 - struct timespec start_struct = *the_start; - struct timespec *start = &start_struct; - uint32_t nsecs_per_sec = TOD_NANOSECONDS_PER_SECOND; - - if (end->tv_nsec < start->tv_nsec) { - int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec + 1; - start->tv_nsec -= nsecs_per_sec * seconds; - start->tv_sec += seconds; - } - - if (end->tv_nsec - start->tv_nsec > nsecs_per_sec) { - int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec; - start->tv_nsec += nsecs_per_sec * seconds; - start->tv_sec -= seconds; - } -#else - -#endif - - if (end->tv_nsec < start->tv_nsec) { - result->tv_sec = end->tv_sec - start->tv_sec - 1; - result->tv_nsec = (TOD_NANOSECONDS_PER_SECOND - start->tv_nsec) + end->tv_nsec; - } else { - result->tv_sec = end->tv_sec - start->tv_sec; - result->tv_nsec = end->tv_nsec - start->tv_nsec; - } -} diff --git a/cpukit/posix/src/posixtimespectointerval.c b/cpukit/posix/src/posixtimespectointerval.c deleted file mode 100644 index 92be3e508f..0000000000 --- a/cpukit/posix/src/posixtimespectointerval.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - * $Id$ - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <time.h> -#include <errno.h> - -#include <rtems/system.h> -#include <rtems/score/isr.h> -#include <rtems/score/thread.h> -#include <rtems/score/tod.h> - -#include <rtems/seterr.h> -#include <rtems/posix/time.h> - -/*PAGE - * - * _POSIX_Timespec_to_interval - */ - -Watchdog_Interval _POSIX_Timespec_to_interval( - const struct timespec *time -) -{ - Watchdog_Interval ticks; - - ticks = time->tv_sec * - (TOD_MICROSECONDS_PER_SECOND / _TOD_Microseconds_per_tick); - - ticks += (time->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) / - _TOD_Microseconds_per_tick; - - if (ticks) - return ticks; - - return 1; -} diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c index bbd7a73a9e..9b04b5bfdf 100644 --- a/cpukit/posix/src/pthread.c +++ b/cpukit/posix/src/pthread.c @@ -1,4 +1,11 @@ /* + * 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$ */ @@ -70,7 +77,7 @@ void _POSIX_Threads_Sporadic_budget_TSR( api = the_thread->API_Extensions[ THREAD_API_POSIX ]; - ticks = _POSIX_Timespec_to_interval( &api->schedparam.ss_initial_budget ); + ticks = _Timespec_To_ticks( &api->schedparam.ss_initial_budget ); if ( !ticks ) ticks = 1; @@ -84,7 +91,7 @@ void _POSIX_Threads_Sporadic_budget_TSR( the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, TRUE ); - ticks = _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period ); + ticks = _Timespec_To_ticks( &api->schedparam.ss_replenish_period ); if ( !ticks ) ticks = 1; diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c index 61a59c01f8..b2b1ed128b 100644 --- a/cpukit/posix/src/pthreadcreate.c +++ b/cpukit/posix/src/pthreadcreate.c @@ -1,7 +1,8 @@ /* * 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144 - * - * COPYRIGHT (c) 1989-1999. + */ + +/* COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -126,8 +127,8 @@ int pthread_create( budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; budget_callout = _POSIX_Threads_Sporadic_budget_callout; - if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) < - _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) ) + if ( _Timespec_To_ticks( &schedparam.ss_replenish_period ) < + _Timespec_To_ticks( &schedparam.ss_initial_budget ) ) return EINVAL; if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) ) @@ -230,7 +231,7 @@ int pthread_create( if ( schedpolicy == SCHED_SPORADIC ) { _Watchdog_Insert_ticks( &api->Sporadic_timer, - _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period ) + _Timespec_To_ticks( &api->schedparam.ss_replenish_period ) ); } diff --git a/cpukit/posix/src/pthreadsetschedparam.c b/cpukit/posix/src/pthreadsetschedparam.c index 3413dbfc74..63b45f8669 100644 --- a/cpukit/posix/src/pthreadsetschedparam.c +++ b/cpukit/posix/src/pthreadsetschedparam.c @@ -1,8 +1,9 @@ /* * 13.5.2 Dynamic Thread Scheduling Parameters Access, * P1003.1c/Draft 10, p. 124 - * - * COPYRIGHT (c) 1989-1999. + */ + +/* COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -66,8 +67,8 @@ int pthread_setschedparam( budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; budget_callout = _POSIX_Threads_Sporadic_budget_callout; - if ( _POSIX_Timespec_to_interval( ¶m->ss_replenish_period ) < - _POSIX_Timespec_to_interval( ¶m->ss_initial_budget ) ) + if ( _Timespec_To_ticks( ¶m->ss_replenish_period ) < + _Timespec_To_ticks( ¶m->ss_initial_budget ) ) return EINVAL; if ( !_POSIX_Priority_Is_valid( param->ss_low_priority ) ) diff --git a/cpukit/posix/src/ptimer1.c b/cpukit/posix/src/ptimer1.c index 9a63441f52..2ee201ddda 100644 --- a/cpukit/posix/src/ptimer1.c +++ b/cpukit/posix/src/ptimer1.c @@ -1,5 +1,12 @@ /* - * ptimer.c,v 1.1 1996/06/03 16:29:58 joel Exp + * 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 @@ -344,7 +351,7 @@ int timer_settime( /* The fire time is relative: use "rtems_time_fire_after" */ case POSIX_TIMER_RELATIVE: /* First, convert from seconds and nanoseconds to ticks */ - ptimer->ticks = _POSIX_Timespec_to_interval( &value->it_value ); + ptimer->ticks = _Timespec_To_ticks( &value->it_value ); activated = _Watchdog_Insert_ticks_helper( &ptimer->Timer, @@ -422,11 +429,13 @@ int timer_gettime( /* Calculates the time left before the timer finishes */ - _POSIX_Timespec_subtract( - &ptimer->timer_data.it_value, ¤t_time, &value->it_value); + _Timespec_Subtract( + &ptimer->timer_data.it_value, + ¤t_time, + &value->it_value + ); - value->it_interval.tv_sec = ptimer->timer_data.it_interval.tv_sec; - value->it_interval.tv_nsec = ptimer->timer_data.it_interval.tv_nsec; + value->it_interval = ptimer->timer_data.it_interval; _Thread_Enable_dispatch(); return 0; diff --git a/cpukit/posix/src/sched.c b/cpukit/posix/src/sched.c index 825294e056..c298655dc7 100644 --- a/cpukit/posix/src/sched.c +++ b/cpukit/posix/src/sched.c @@ -1,4 +1,11 @@ /* + * 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$ */ @@ -126,8 +133,6 @@ int sched_rr_get_interval( struct timespec *interval ) { - /* XXX do we need to support different time quantums per thread */ - /* * Only supported for the "calling process" (i.e. this node). */ @@ -138,7 +143,7 @@ int sched_rr_get_interval( if ( !interval ) rtems_set_errno_and_return_minus_one( EINVAL ); - _POSIX_Interval_to_timespec( _Thread_Ticks_per_timeslice, interval ); + _Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval ); return 0; } diff --git a/cpukit/posix/src/semtimedwait.c b/cpukit/posix/src/semtimedwait.c index 662845ecd9..6b93b9232b 100644 --- a/cpukit/posix/src/semtimedwait.c +++ b/cpukit/posix/src/semtimedwait.c @@ -1,4 +1,11 @@ /* + * 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$ */ @@ -43,26 +50,18 @@ int sem_timedwait( /* * Error check the absolute time to timeout */ -#if 0 - if ( /* abstime->tv_sec < 0 || */ abstime->tv_nsec ) /* tv_sec is unsigned */ + if ( !_Timespec_Is_valid( abstime ) ) { blocking = CORE_SEMAPHORE_BAD_TIMEOUT_VALUE; - else -#endif - if ( abstime->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { - blocking = CORE_SEMAPHORE_BAD_TIMEOUT; } else { - clock_gettime( CLOCK_REALTIME, ¤t_time ); + _TOD_Get( ¤t_time ); /* * Make sure the abstime is in the future */ - if ( abstime->tv_sec < current_time.tv_sec ) - blocking = CORE_SEMAPHORE_BAD_TIMEOUT; - else if ( (abstime->tv_sec == current_time.tv_sec) && - (abstime->tv_nsec <= current_time.tv_nsec) ) + if ( _Timespec_Less_than( abstime, ¤t_time ) ) { blocking = CORE_SEMAPHORE_BAD_TIMEOUT; - else { - _POSIX_Timespec_subtract( ¤t_time, abstime, &difference ); - ticks = _POSIX_Timespec_to_interval( &difference ); + } else { + _Timespec_Subtract( ¤t_time, abstime, &difference ); + ticks = _Timespec_To_ticks( &difference ); blocking = CORE_SEMAPHORE_BLOCK_WITH_TIMEOUT; } } diff --git a/cpukit/posix/src/sigtimedwait.c b/cpukit/posix/src/sigtimedwait.c index 1486be3054..311e6cc90a 100644 --- a/cpukit/posix/src/sigtimedwait.c +++ b/cpukit/posix/src/sigtimedwait.c @@ -1,7 +1,7 @@ /* * 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76 * - * COPYRIGHT (c) 1989-1999. + * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -68,12 +68,11 @@ int sigtimedwait( interval = 0; if ( timeout ) { - if ( timeout->tv_nsec < 0 || - timeout->tv_nsec >= TOD_NANOSECONDS_PER_SECOND) { + if ( !_Timespec_Is_valid( timeout ) ) { rtems_set_errno_and_return_minus_one( EINVAL ); } - interval = _POSIX_Timespec_to_interval( timeout ); + interval = _Timespec_To_ticks( timeout ); } /* @@ -96,7 +95,13 @@ int sigtimedwait( if ( *set & api->signals_pending ) { /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending ); - _POSIX_signals_Clear_signals( api, the_info->si_signo, the_info, FALSE, FALSE ); + _POSIX_signals_Clear_signals( + api, + the_info->si_signo, + the_info, + FALSE, + FALSE + ); _ISR_Enable( level ); the_info->si_code = SI_USER; diff --git a/cpukit/posix/src/ualarm.c b/cpukit/posix/src/ualarm.c index d2b524ef5b..a5a8ee926b 100644 --- a/cpukit/posix/src/ualarm.c +++ b/cpukit/posix/src/ualarm.c @@ -1,7 +1,7 @@ /* - * XXX 3.4.1 Schedule Alarm, P1003.1b-1993, p. 79 + * 3.4.1 Schedule Alarm, P1003.1b-1993, p. 79 * - * COPYRIGHT (c) 1989-2003. + * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -75,12 +75,9 @@ useconds_t ualarm( ticks = the_timer->initial; ticks -= (the_timer->stop_time - the_timer->start_time); - /* remaining is now in ticks */ - ticks *= _TOD_Microseconds_per_tick; - ticks /= TOD_MICROSECONDS_PER_SECOND; - _POSIX_Interval_to_timespec( ticks, &tp ); + _Timespec_From_ticks( ticks, &tp ); remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND; remaining += tp.tv_nsec / 1000; break; @@ -89,8 +86,7 @@ useconds_t ualarm( tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; - ticks = _POSIX_Timespec_to_interval( &tp ); - _Watchdog_Insert_ticks( the_timer, ticks ); + _Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) ); return remaining; } diff --git a/cpukit/rtems/src/clocktodtoseconds.c b/cpukit/rtems/src/clocktodtoseconds.c index 0caac50214..f9ec18b4c3 100644 --- a/cpukit/rtems/src/clocktodtoseconds.c +++ b/cpukit/rtems/src/clocktodtoseconds.c @@ -1,7 +1,6 @@ /* * Time of Day (TOD) Handler - Classic TOD to Seconds * - * * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * @@ -80,5 +79,7 @@ uint32_t _TOD_To_seconds( time += the_tod->second; + time += TOD_SECONDS_1970_THROUGH_1988; + return( time ); } diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index a4b217fda1..53aa6c4243 100644 --- a/cpukit/score/Makefile.am +++ b/cpukit/score/Makefile.am @@ -28,10 +28,10 @@ include_rtems_score_HEADERS = include/rtems/score/address.h \ include/rtems/score/object.h include/rtems/score/priority.h \ include/rtems/score/stack.h include/rtems/score/states.h \ include/rtems/score/sysstate.h include/rtems/score/thread.h \ - include/rtems/score/threadq.h include/rtems/score/tod.h \ - include/rtems/score/tqdata.h include/rtems/score/userext.h \ - include/rtems/score/watchdog.h include/rtems/score/wkspace.h \ - include/rtems/score/cpuopts.h + include/rtems/score/threadq.h include/rtems/score/timespec.h \ + include/rtems/score/tod.h include/rtems/score/tqdata.h \ + include/rtems/score/userext.h include/rtems/score/watchdog.h \ + include/rtems/score/wkspace.h include/rtems/score/cpuopts.h if HAS_MP # We only build multiprocessing related files if HAS_MP was defined @@ -140,7 +140,9 @@ libscore_a_SOURCES += src/threadq.c src/threadqdequeue.c \ src/threadqtimeout.c ## TIMESPEC_C_FILES -## libscore_a_SOURCES += +libscore_a_SOURCES += src/timespecaddto.c src/timespecfromticks.c \ + src/timespecisvalid.c src/timespeclessthan.c src/timespecsubtract.c \ + src/timespectoticks.c ## TOD_C_FILES libscore_a_SOURCES += src/coretod.c src/coretodset.c src/coretodget.c \ diff --git a/cpukit/score/include/rtems/score/timespec.h b/cpukit/score/include/rtems/score/timespec.h new file mode 100644 index 0000000000..b8c4d16f24 --- /dev/null +++ b/cpukit/score/include/rtems/score/timespec.h @@ -0,0 +1,130 @@ +/** + * @file rtems/score/timespec.h + * + * This include file contains helpers for manipulating timespecs. + */ + +/* + * 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$ + */ + +#ifndef _RTEMS_SCORE_TIMESPEC_H +#define _RTEMS_SCORE_TIMESPEC_H + +/** + * @defgroup Timespec Helpers + * + * This handler encapsulates functionality related to manipulating + * POSIX struct timespecs. + */ +/**@{*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/types.h> +#include <rtems/score/tod.h> +#include <rtems/score/watchdog.h> + +/** @brief Is Timespec Valid + * + * This method determines the validatity of a timespec. + * + * @param[in] time is the timespec instance to validate. + * + * @return This method returns true if @a time is valid and + * false otherwise. + */ +boolean _Timespec_Is_valid( + const struct timespec *time +); + +/** @brief Timespec Less Than Operator + * + * This method is the less than operator for timespecs. + * + * @param[in] lhs is the left hand side timespec + * @param[in] rhs is the left hand side timespec + * + * @return This method returns true if @a lhs is less than the @a rhs and + * false otherwise. + */ +boolean _Timespec_Less_than( + const struct timespec *lhs, + const struct timespec *rhs +); + +/** @brief Add to a Timespec + * + * This routine adds two timespecs. The second argument is added + * to the first. + * + * @param[in] time is the base time to be added to + * @param[in] add is the timespec to add to the first argument + * + * @return This method returns the number of seconds @a time increased by. + */ +uint32_t _Timespec_Add_to( + struct timespec *time, + const struct timespec *add +); + +/** @brief Convert Timespec to Number of Ticks + * + * This routine convert the @a time timespec to the corresponding number + * of clock ticks. + * + * @param[in] time is the time to be converted + * + * @return This method returns the number of ticks computed. + */ +uint32_t _Timespec_To_ticks( + const struct timespec *time +); + +/** @brief Convert Ticks to Timespec + * + * This routine converts the @a ticks value to the corresponding + * timespec format @a time. + * + * @param[in] time is the timespec format time result + * @param[in] ticks is the number of ticks to convert + */ +void _Timespec_From_ticks( + uint32_t ticks, + struct timespec *time +); + +/** @brief Subtract Two Timespec + * + * This routine subtracts two timespecs. @a result is set to + * @a end - @a start. + * + * @param[in] start is the starting time + * @param[in] end is the ending time + * @param[in] result is the difference between starting and ending time. + * + * @return This method fills in @a result. + */ +void _Timespec_Subtract( + const struct timespec *start, + const struct timespec *end, + struct timespec *result +); + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif +/* end of include file */ diff --git a/cpukit/score/include/rtems/score/tod.h b/cpukit/score/include/rtems/score/tod.h index c07a48a3e5..a0c252e376 100644 --- a/cpukit/score/include/rtems/score/tod.h +++ b/cpukit/score/include/rtems/score/tod.h @@ -137,7 +137,7 @@ SCORE_EXTERN struct timespec _TOD_Uptime; * The following contains the number of seconds from 00:00:00 * January 1, TOD_BASE_YEAR until the current time of day. */ -SCORE_EXTERN Watchdog_Interval _TOD_Seconds_since_epoch; +#define _TOD_Seconds_since_epoch (_TOD_Now.tv_sec) /** @brief Microseconds per Clock Tick * @@ -217,6 +217,17 @@ void _TOD_Tickle_ticks( void ); #define TOD_MILLISECONDS_TO_TICKS(_ms) \ (TOD_MILLISECONDS_TO_MICROSECONDS(_ms) / _TOD_Microseconds_per_tick) + +/** @brief How many ticks in a second? + * + * This macro returns the number of ticks in a second. + * + * @note If the clock tick value does not multiply evenly into a second + * then this number of ticks will be slightly shorter than a second. + */ +#define TOD_TICKS_PER_SECOND \ + (TOD_MICROSECONDS_PER_SECOND / _TOD_Microseconds_per_tick) + #ifndef __RTEMS_APPLICATION__ #include <rtems/score/tod.inl> #endif diff --git a/cpukit/score/inline/rtems/score/tod.inl b/cpukit/score/inline/rtems/score/tod.inl index 10a370f7f2..fbfd7037de 100644 --- a/cpukit/score/inline/rtems/score/tod.inl +++ b/cpukit/score/inline/rtems/score/tod.inl @@ -27,34 +27,6 @@ */ /** - * - * This routines adds two timespecs. The second argument is added - * to the first. - */ - -RTEMS_INLINE_ROUTINE uint32_t _TOD_Add_timespec( - struct timespec *time, - struct timespec *add -) -{ - uint32_t seconds = 0; - - - /* Add the basics */ - time->tv_sec += add->tv_sec; - time->tv_nsec += add->tv_nsec; - - /* Now adjust it so nanoseconds is in range */ - while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { - time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND; - time->tv_sec++; - seconds++; - } - - return seconds; -} - -/** * This routine deactivates updating of the current time of day. */ diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am index b2d277b788..c82a22b21b 100644 --- a/cpukit/score/preinstall.am +++ b/cpukit/score/preinstall.am @@ -127,6 +127,10 @@ $(PROJECT_INCLUDE)/rtems/score/threadq.h: include/rtems/score/threadq.h $(PROJEC $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/threadq.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/threadq.h +$(PROJECT_INCLUDE)/rtems/score/timespec.h: include/rtems/score/timespec.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/timespec.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/timespec.h + $(PROJECT_INCLUDE)/rtems/score/tod.h: include/rtems/score/tod.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/tod.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/tod.h diff --git a/cpukit/score/src/coretod.c b/cpukit/score/src/coretod.c index 5c9c935483..fbadaf673d 100644 --- a/cpukit/score/src/coretod.c +++ b/cpukit/score/src/coretod.c @@ -1,8 +1,8 @@ /* * Time of Day (TOD) Handler - * - * - * COPYRIGHT (c) 1989-1999. + */ + +/* COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -48,9 +48,6 @@ void _TOD_Handler_initialization( _TOD_Uptime.tv_sec = 0; _TOD_Uptime.tv_nsec = 0; - /* Seconds since RTEMS Epoch (1988) */ - _TOD_Seconds_since_epoch = 0; - /* TOD has not been set */ _TOD_Is_set = FALSE; _TOD_Activate(); diff --git a/cpukit/score/src/coretodget.c b/cpukit/score/src/coretodget.c index 96ae194f30..3a5e2db16c 100644 --- a/cpukit/score/src/coretodget.c +++ b/cpukit/score/src/coretodget.c @@ -17,6 +17,7 @@ #include <rtems/system.h> #include <rtems/score/isr.h> +#include <rtems/score/timespec.h> #include <rtems/score/tod.h> /* @@ -49,5 +50,5 @@ void _TOD_Get( offset.tv_nsec = (*_Watchdog_Nanoseconds_since_tick_handler)(); _ISR_Enable( level ); - _TOD_Add_timespec( time, &offset ); + _Timespec_Add_to( time, &offset ); } diff --git a/cpukit/score/src/coretodgetuptime.c b/cpukit/score/src/coretodgetuptime.c index e420c0863d..e0047070b5 100644 --- a/cpukit/score/src/coretodgetuptime.c +++ b/cpukit/score/src/coretodgetuptime.c @@ -1,7 +1,8 @@ /* * Time of Day (TOD) Handler - get uptime - * - * COPYRIGHT (c) 1989-2007. + */ + +/* COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -17,6 +18,7 @@ #include <rtems/system.h> #include <rtems/score/isr.h> +#include <rtems/score/timespec.h> #include <rtems/score/tod.h> /* @@ -48,5 +50,5 @@ void _TOD_Get_uptime( offset.tv_nsec = (*_Watchdog_Nanoseconds_since_tick_handler)(); _ISR_Enable( level ); - _TOD_Add_timespec( uptime, &offset ); + _Timespec_Add_to( uptime, &offset ); } diff --git a/cpukit/score/src/coretodset.c b/cpukit/score/src/coretodset.c index 21f77d8001..d689a62e89 100644 --- a/cpukit/score/src/coretodset.c +++ b/cpukit/score/src/coretodset.c @@ -1,8 +1,8 @@ /* - * Time of Day (TOD) Handler - * - * - * COPYRIGHT (c) 1989-1999. + * Time of Day (TOD) Handler -- Set Time + */ + +/* COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -49,12 +49,9 @@ void _TOD_Set( _Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - _TOD_Seconds_since_epoch ); - _TOD_Seconds_since_epoch = time->tv_sec; - _TOD_Is_set = TRUE; - /* POSIX format TOD (timespec) */ - _TOD_Now = *time; - _TOD_Now.tv_sec += TOD_SECONDS_1970_THROUGH_1988; + _TOD_Now = *time; + _TOD_Is_set = TRUE; _TOD_Activate( 0 ); diff --git a/cpukit/score/src/coretodtickle.c b/cpukit/score/src/coretodtickle.c index a9b12646f4..1afef420a2 100644 --- a/cpukit/score/src/coretodtickle.c +++ b/cpukit/score/src/coretodtickle.c @@ -1,8 +1,8 @@ - /* * Time of Day (TOD) Handler -- Tickle Ticks - * - * COPYRIGHT (c) 1989-2007. + */ + +/* COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -19,6 +19,7 @@ #include <rtems/system.h> #include <rtems/score/object.h> #include <rtems/score/thread.h> +#include <rtems/score/timespec.h> #include <rtems/score/tod.h> #include <rtems/score/watchdog.h> @@ -46,11 +47,11 @@ void _TOD_Tickle_ticks( void ) _Watchdog_Ticks_since_boot += 1; /* Update the timespec format uptime */ - (void) _TOD_Add_timespec( &_TOD_Uptime, &tick ); + (void) _Timespec_Add_to( &_TOD_Uptime, &tick ); /* we do not care how much the uptime changed */ /* Update the timespec format TOD */ - seconds = _TOD_Add_timespec( &_TOD_Now, &tick ); + seconds = _Timespec_Add_to( &_TOD_Now, &tick ); while ( seconds ) { _Watchdog_Tickle_seconds(); seconds--; diff --git a/cpukit/score/src/timespecaddto.c b/cpukit/score/src/timespecaddto.c new file mode 100644 index 0000000000..400b675405 --- /dev/null +++ b/cpukit/score/src/timespecaddto.c @@ -0,0 +1,51 @@ +/** + * @file score/src//timespecaddto.c + */ + +/* + * 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 <rtems/system.h> +#include <sys/types.h> +#include <rtems/score/timespec.h> +#include <rtems/score/tod.h> +#include <rtems/score/watchdog.h> + +/** + * + * This routines adds two timespecs. The second argument is added + * to the first. + */ + +uint32_t _Timespec_Add_to( + struct timespec *time, + const struct timespec *add +) +{ + uint32_t seconds = add->tv_sec; + + /* Add the basics */ + time->tv_sec += add->tv_sec; + time->tv_nsec += add->tv_nsec; + + /* Now adjust it so nanoseconds is in range */ + while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { + time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND; + time->tv_sec++; + seconds++; + } + + return seconds; +} diff --git a/cpukit/posix/src/posixintervaltotimespec.c b/cpukit/score/src/timespecfromticks.c index b507c56935..73dda79db9 100644 --- a/cpukit/posix/src/posixintervaltotimespec.c +++ b/cpukit/score/src/timespecfromticks.c @@ -1,4 +1,11 @@ /* + * 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$ */ @@ -7,24 +14,14 @@ #endif #include <time.h> -#include <errno.h> #include <rtems/system.h> -#include <rtems/score/isr.h> -#include <rtems/score/thread.h> +#include <rtems/score/timespec.h> #include <rtems/score/tod.h> -#include <rtems/seterr.h> -#include <rtems/posix/time.h> - -/*PAGE - * - * _POSIX_Interval_to_timespec - */ - -void _POSIX_Interval_to_timespec( - Watchdog_Interval ticks, - struct timespec *time +void _Timespec_From_ticks( + uint32_t ticks, + struct timespec *time ) { uint32_t usecs; diff --git a/cpukit/score/src/timespecisvalid.c b/cpukit/score/src/timespecisvalid.c new file mode 100644 index 0000000000..5ae50f3c4c --- /dev/null +++ b/cpukit/score/src/timespecisvalid.c @@ -0,0 +1,43 @@ +/** + * @file score/src/timespecisvalid.c + */ + +/* + * 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 <sys/types.h> + +#include <rtems/system.h> +#include <rtems/score/timespec.h> +#include <rtems/score/tod.h> + +boolean _Timespec_Is_valid( + const struct timespec *time +) +{ + if ( !time ) + return FALSE; + + if ( time->tv_sec < 0 ) + return FALSE; + + if ( time->tv_nsec < 0 ) + return FALSE; + + if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) + return FALSE; + + return TRUE; +} diff --git a/cpukit/score/src/timespeclessthan.c b/cpukit/score/src/timespeclessthan.c new file mode 100644 index 0000000000..df824b2d27 --- /dev/null +++ b/cpukit/score/src/timespeclessthan.c @@ -0,0 +1,42 @@ +/** + * @file score/src/timespeclessthan.c + */ + +/* + * 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 <sys/types.h> + +#include <rtems/system.h> +#include <rtems/score/timespec.h> +#include <rtems/score/tod.h> + +boolean _Timespec_Less_than( + const struct timespec *lhs, + const struct timespec *rhs +) +{ + if ( lhs->tv_sec < rhs->tv_sec ) + return TRUE; + + if ( lhs->tv_sec > rhs->tv_sec ) + return FALSE; + + /* ASSERT: lhs->tv_sec == rhs->tv_sec */ + if ( lhs->tv_nsec < rhs->tv_nsec ) + return TRUE; + + return FALSE; +} diff --git a/cpukit/score/src/timespecsubtract.c b/cpukit/score/src/timespecsubtract.c new file mode 100644 index 0000000000..d17107fcc0 --- /dev/null +++ b/cpukit/score/src/timespecsubtract.c @@ -0,0 +1,41 @@ +/** + * @file score/src/timespecsubtract.c + */ + +/* + * 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 <rtems/system.h> +#include <sys/types.h> +#include <rtems/score/timespec.h> +#include <rtems/score/tod.h> +#include <rtems/score/watchdog.h> + +void _Timespec_Subtract( + const struct timespec *start, + const struct timespec *end, + struct timespec *result +) +{ + + if (end->tv_nsec < start->tv_nsec) { + result->tv_sec = end->tv_sec - start->tv_sec - 1; + result->tv_nsec = + (TOD_NANOSECONDS_PER_SECOND - start->tv_nsec) + end->tv_nsec; + } else { + result->tv_sec = end->tv_sec - start->tv_sec; + result->tv_nsec = end->tv_nsec - start->tv_nsec; + } +} diff --git a/cpukit/score/src/timespectoticks.c b/cpukit/score/src/timespectoticks.c new file mode 100644 index 0000000000..550ce617b3 --- /dev/null +++ b/cpukit/score/src/timespectoticks.c @@ -0,0 +1,49 @@ +/** + * @file score/src/timespectoticks.c + */ + +/* + * 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 <rtems/system.h> +#include <rtems/score/timespec.h> +#include <sys/types.h> +#include <rtems/score/tod.h> +#include <rtems/score/watchdog.h> + +/** + * + * This routines converts a timespec to the corresponding number of ticks. + */ + +uint32_t _Timespec_To_ticks( + const struct timespec *time +) +{ + uint32_t ticks; + + if ( (time->tv_sec == 0) && (time->tv_nsec == 0) ) + return 0; + + ticks = time->tv_sec * TOD_TICKS_PER_SECOND; + + ticks += (time->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) / + _TOD_Microseconds_per_tick; + + if (ticks) + return ticks; + + return 1; +} |