mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-26 14:18:20 +00:00
2002-08-21 Joel Sherrill <joel@OARcorp.com>
* src/adjtime.c: New file -- adjtime() support required by the Network Time Protocol (NTP) port to RTEMS. * src/Makefile.am: Modified to reflect above.
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
2002-08-21 Joel Sherrill <joel@OARcorp.com>
|
||||
|
||||
* src/adjtime.c: New file -- adjtime() support required by the
|
||||
Network Time Protocol (NTP) port to RTEMS.
|
||||
* src/Makefile.am: Modified to reflect above.
|
||||
|
||||
2002-08-09 Joel Sherrill <joel@OARcorp.com>
|
||||
|
||||
* src/cancelrun.c: Remove check for PTHREAD_CANCELED not being defined
|
||||
|
||||
@@ -67,10 +67,10 @@ SEMAPHORE_C_FILES = semaphore.c semaphorecreatesupp.c semaphoredeletesupp.c \
|
||||
semdestroy.c semgetvalue.c seminit.c semopen.c sempost.c semtimedwait.c \
|
||||
semtrywait.c semunlink.c semwait.c
|
||||
|
||||
TIME_C_FILES = time.c posixtimespecsubtract.c posixtimespectointerval.c \
|
||||
posixintervaltotimespec.c clockgetcpuclockid.c clockgetenableattr.c \
|
||||
clockgetres.c clockgettime.c clocksetenableattr.c clocksettime.c \
|
||||
nanosleep.c sleep.c
|
||||
TIME_C_FILES = adjtime.c time.c posixtimespecsubtract.c \
|
||||
posixtimespectointerval.c posixintervaltotimespec.c clockgetcpuclockid.c \
|
||||
clockgetenableattr.c clockgetres.c clockgettime.c clocksetenableattr.c \
|
||||
clocksettime.c nanosleep.c sleep.c
|
||||
|
||||
# the timer manager needs to be split further but only after its
|
||||
# dependence on the Classic API Timer Manager is removed.
|
||||
|
||||
60
cpukit/posix/src/adjtime.c
Normal file
60
cpukit/posix/src/adjtime.c
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* adjustime() 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
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <rtems/system.h>
|
||||
#include <rtems/score/tod.h>
|
||||
#include <rtems/posix/time.h>
|
||||
|
||||
static long __adjustment = 0;
|
||||
|
||||
int adjtime ( struct timeval *delta, struct timeval *olddelta )
|
||||
{
|
||||
struct timespec ts;
|
||||
|
||||
if ( olddelta ) {
|
||||
olddelta->tv_sec = __adjustment / TOD_MICROSECONDS_PER_SECOND;
|
||||
olddelta->tv_usec = __adjustment / TOD_MICROSECONDS_PER_SECOND;
|
||||
}
|
||||
|
||||
if ( !delta )
|
||||
return -1;
|
||||
|
||||
__adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND) + delta->tv_usec;
|
||||
/* too small to account for */
|
||||
if ( __adjustment < _TOD_Microseconds_per_tick )
|
||||
return 0;
|
||||
|
||||
clock_gettime( CLOCK_REALTIME, &ts );
|
||||
|
||||
ts.tv_sec += (__adjustment / TOD_MICROSECONDS_PER_SECOND);
|
||||
ts.tv_nsec += (__adjustment % TOD_MICROSECONDS_PER_SECOND) *
|
||||
TOD_NANOSECONDS_PER_MICROSECOND;
|
||||
|
||||
/* if adjustment is too much positive */
|
||||
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
|
||||
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
|
||||
ts.tv_sec++;
|
||||
}
|
||||
|
||||
/* if adjustment is too much negative */
|
||||
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
|
||||
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
|
||||
ts.tv_sec--;
|
||||
}
|
||||
|
||||
clock_settime( CLOCK_REALTIME, &ts );
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user