aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/xntpd/util/precision.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/xntpd/util/precision.c')
-rw-r--r--usr.sbin/xntpd/util/precision.c150
1 files changed, 0 insertions, 150 deletions
diff --git a/usr.sbin/xntpd/util/precision.c b/usr.sbin/xntpd/util/precision.c
deleted file mode 100644
index 64fe336fe662..000000000000
--- a/usr.sbin/xntpd/util/precision.c
+++ /dev/null
@@ -1,150 +0,0 @@
-#include <sys/types.h>
-#include <sys/time.h>
-#include "ntp_unixtime.h"
-
-#define DEFAULT_SYS_PRECISION -99
-
-int default_get_resolution();
-int default_get_precision();
-
-int
-main() {
- printf("log2(resolution) = %d, log2(precision) = %d\n",
- default_get_resolution(),
- default_get_precision());
- return 0;
-}
-
-/* Find the resolution of the system clock by watching how the current time
- * changes as we read it repeatedly.
- *
- * struct timeval is only good to 1us, which may cause problems as machines
- * get faster, but until then the logic goes:
- *
- * If a machine has resolution (i.e. accurate timing info) > 1us, then it will
- * probably use the "unused" low order bits as a counter (to force time to be
- * a strictly increaing variable), incrementing it each time any process
- * requests the time [[ or maybe time will stand still ? ]].
- *
- * SO: the logic goes:
- *
- * IF the difference from the last time is "small" (< MINSTEP)
- * THEN this machine is "counting" with the low order bits
- * ELIF this is not the first time round the loop
- * THEN this machine *WAS* counting, and has now stepped
- * ELSE this machine has resolution < time to read clock
- *
- * SO: if it exits on the first loop, assume "full accuracy" (1us)
- * otherwise, take the log2(observered difference, rounded UP)
- *
- * MINLOOPS > 1 ensures that even if there is a STEP between the initial call
- * and the first loop, it doesn't stop too early.
- * Making it even greater allows MINSTEP to be reduced, assuming that the
- * chance of MINSTEP-1 other processes getting in and calling gettimeofday
- * between this processes's calls.
- * Reducing MINSTEP may be necessary as this sets an upper bound for the time
- * to actually call gettimeofday.
- */
-
-#define DUSECS 1000000
-#define HUSECS (1024 * 1024)
-#define MINSTEP 5 /* some systems increment uS on each call */
- /* Don't use "1" as some *other* process may read too*/
- /*We assume no system actually *ANSWERS* in this time*/
-#define MAXSTEP 20000 /* maximum clock increment (us) */
-#define MINLOOPS 5 /* minimum number of step samples */
-#define MAXLOOPS HUSECS /* Assume precision < .1s ! */
-
-int default_get_resolution()
-{
- struct timeval tp;
- struct timezone tzp;
- long last;
- int i;
- long diff;
- long val;
- int minsteps = MINLOOPS; /* need at least this many steps */
-
- gettimeofday(&tp, &tzp);
- last = tp.tv_usec;
- for (i = - --minsteps; i< MAXLOOPS; i++) {
- gettimeofday(&tp, &tzp);
- diff = tp.tv_usec - last;
- if (diff < 0) diff += DUSECS;
- if (diff > MINSTEP) if (minsteps-- <= 0) break;
- last = tp.tv_usec;
- }
-
- printf("resolution = %ld usec after %d loop%s\n",
- diff, i, (i==1) ? "" : "s");
-
- diff = (diff *3)/2;
- if (i >= MAXLOOPS) {
- printf(
- " (Boy this machine is fast ! %d loops without a step)\n",
- MAXLOOPS);
- diff = 1; /* No STEP, so FAST machine */
- }
- if (i == 0) {
- printf(
-" (The resolution is less than the time to read the clock -- Assume 1us)\n");
- diff = 1; /* time to read clock >= resolution */
- }
- for (i=0, val=HUSECS; val>0; i--, val >>= 1) if (diff >= val) return i;
- printf(" (Oh dear -- that wasn't expected ! I'll guess !)\n");
- return DEFAULT_SYS_PRECISION /* Something's BUST, so lie ! */;
-}
-
-/* ===== Rest of this code lifted straight from xntpd/ntp_proto.c ! ===== */
-
-/*
- * This routine calculates the differences between successive calls to
- * gettimeofday(). If a difference is less than zero, the us field
- * has rolled over to the next second, so we add a second in us. If
- * the difference is greater than zero and less than MINSTEP, the
- * clock has been advanced by a small amount to avoid standing still.
- * If the clock has advanced by a greater amount, then a timer interrupt
- * has occurred and this amount represents the precision of the clock.
- * In order to guard against spurious values, which could occur if we
- * happen to hit a fat interrupt, we do this for MINLOOPS times and
- * keep the minimum value obtained.
- */
-int default_get_precision()
-{
- struct timeval tp;
- struct timezone tzp;
- long last;
- int i;
- long diff;
- long val;
- long usec;
-
- usec = 0;
- val = MAXSTEP;
- GETTIMEOFDAY(&tp, &tzp);
- last = tp.tv_usec;
- for (i = 0; i < MINLOOPS && usec < HUSECS;) {
- GETTIMEOFDAY(&tp, &tzp);
- diff = tp.tv_usec - last;
- last = tp.tv_usec;
- if (diff < 0)
- diff += DUSECS;
- usec += diff;
- if (diff > MINSTEP) {
- i++;
- if (diff < val)
- val = diff;
- }
- }
- printf("precision = %ld usec after %d loop%s\n",
- val, i, (i == 1) ? "" : "s");
- if (usec >= HUSECS) {
- printf(" (Boy this machine is fast ! usec was %ld)\n",
- usec);
- val = MINSTEP; /* val <= MINSTEP; fast machine */
- }
- diff = HUSECS;
- for (i = 0; diff > val; i--)
- diff >>= 1;
- return (i);
-}