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:
Joel Sherrill
2002-08-21 17:45:10 +00:00
parent 06a27bbf32
commit 3d57435de4
3 changed files with 70 additions and 4 deletions

View File

@@ -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

View File

@@ -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.

View 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;
}