diff options
author | Joel Sherrill <joel.sherrill@oarcorp.com> | 2014-07-23 15:35:35 -0500 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@oarcorp.com> | 2014-07-23 16:53:24 -0500 |
commit | 875fff0ae3d7676bbd8816caf1b32e33142d2e73 (patch) | |
tree | de7a2c0e7f8dcdef75aac8a9e913de873aa097b6 /cpukit/posix/src/adjtime.c | |
parent | adjtime.c: Use timestamp math and simplify (diff) | |
download | rtems-875fff0ae3d7676bbd8816caf1b32e33142d2e73.tar.bz2 |
Add _TOD_Adjust to SCORE TOD Handler.
This lays the proper structure for doing future work on
time adjustment algorithms. Any TOD adjustments should be
requested at the API level and performed at the SCORE level.
Additionally updated a test.
Diffstat (limited to 'cpukit/posix/src/adjtime.c')
-rw-r--r-- | cpukit/posix/src/adjtime.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/cpukit/posix/src/adjtime.c b/cpukit/posix/src/adjtime.c index d5a5589418..1ebecce79c 100644 --- a/cpukit/posix/src/adjtime.c +++ b/cpukit/posix/src/adjtime.c @@ -44,8 +44,6 @@ int adjtime( ) { Timestamp_Control delta_as_timestamp; - Timestamp_Control tod_as_timestamp; - Timestamp_Control *tod_as_timestamp_ptr; /* * Simple validations @@ -53,8 +51,19 @@ int adjtime( if ( !delta ) rtems_set_errno_and_return_minus_one( EINVAL ); + if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND ) + rtems_set_errno_and_return_minus_one( EINVAL ); + + /* + * An adjustment of zero is pretty easy. + */ + if ( delta->tv_sec == 0 && delta->tv_usec == 0 ) + return 0; + /* - * Currently, RTEMS does the adjustment in one movement. + * Currently, RTEMS does the adjustment in one movement so there + * is no way an adjustment was currently underway. + * * Given interest, requirements, and sponsorship, a future * enhancement would be to adjust the time in smaller increments * at each clock tick. Until then, there is no outstanding @@ -71,20 +80,9 @@ int adjtime( _Timestamp_Set( &delta_as_timestamp, delta->tv_sec, delta->tv_usec * 1000 ); /* - * This prevents context switches while we are adjusting the TOD + * Now apply the adjustment */ - - _Thread_Disable_dispatch(); - - tod_as_timestamp_ptr = - _TOD_Get_with_nanoseconds( &tod_as_timestamp, &_TOD.now ); - - - _Timestamp_Add_to( tod_as_timestamp_ptr, &delta_as_timestamp ); - - _TOD_Set_with_timestamp( tod_as_timestamp_ptr ); - - _Thread_Enable_dispatch(); + _TOD_Adjust( delta_as_timestamp ); return 0; } |