[Git][NTPsec/ntpsec][master] 2 commits: ntpd/refclock_shm.c: Remove tabs, Single line /* comments to //
Hal Murray (@hal.murray)
gitlab at mg.gitlab.com
Thu Aug 6 19:29:34 UTC 2026
Hal Murray pushed to branch master at NTPsec / ntpsec
Commits:
9b08138f by Gary E. Miller at 2026-08-06T12:26:15-07:00
ntpd/refclock_shm.c: Remove tabs, Single line /* comments to //
No functional changes.
- - - - -
95263fdc by Gary E. Miller at 2026-08-06T12:26:15-07:00
ntpd/refclock_shm.c restore previous comment indents
No functional changes.
- - - - -
1 changed file:
- ntpd/refclock_shm.c
Changes:
=====================================
ntpd/refclock_shm.c
=====================================
@@ -17,7 +17,7 @@
#include "ntp_refclock.h"
#undef fileno
#include "timespecops.h"
-#include "ntp_calendar.h" /* for SECSPERHR */
+#include "ntp_calendar.h" // for SECSPERHR
#undef fileno
#include "ntp_stdlib.h"
#include "ntp_assert.h"
@@ -34,7 +34,7 @@
#if defined(HAVE_STDATOMIC_H) && !defined(__COVERITY__)
# include <stdatomic.h>
-#endif /* HAVE_STDATOMIC_H */
+#endif // HAVE_STDATOMIC_H
/*
* This driver supports a reference clock attached through shared memory
@@ -43,12 +43,12 @@
/*
* SHM interface definitions
*/
-#define PRECISION (-30) /* precision assumed 1 ns */
-#define REFID "SHM" /* reference ID */
-#define NAME "SHM" /* shortname */
+#define PRECISION (-30) // precision assumed 1 ns
+#define REFID "SHM" // reference ID
+#define NAME "SHM" // shortname
#define DESCRIPTION "SHM/Shared memory interface"
-#define NSAMPLES 3 /* stages of median filter */
+#define NSAMPLES 3 // stages of median filter
/*
* Mode flags
@@ -62,89 +62,89 @@ static bool shm_start (int unit, struct peer *peer);
static void shm_shutdown (struct refclockproc *peer);
static void shm_poll (int unit, struct peer *peer);
static void shm_timer (int unit, struct peer *peer);
-static void shm_clockstats (int unit, struct peer *peer);
-static void shm_control (int unit, const struct refclockstat * in_st,
- struct refclockstat * out_st, struct peer *peer);
+static void shm_clockstats (int unit, struct peer *peer);
+static void shm_control (int unit, const struct refclockstat * in_st,
+ struct refclockstat * out_st, struct peer *peer);
/*
* Transfer vector
*/
struct refclock refclock_shm = {
- NAME, /* basename of driver */
- shm_start, /* start up driver */
- shm_shutdown, /* shut down driver */
- shm_poll, /* transmit poll message */
- shm_control, /* control settings */
- NULL, /* not used: init */
- shm_timer, /* once per second */
+ NAME, // basename of driver
+ shm_start, // start up driver
+ shm_shutdown, // shut down driver
+ shm_poll, // transmit poll message
+ shm_control, // control settings
+ NULL, // not used: init
+ shm_timer, // once per second
};
struct shmTime {
- int mode; /* 0 - if valid is set:
- * use values,
- * clear valid
- * 1 - if valid is set:
- * if count before and after read of values is equal,
- * use values
- * clear valid
- */
- volatile int count;
- time_t clockTimeStampSec;
- int clockTimeStampUSec;
- time_t receiveTimeStampSec;
- int receiveTimeStampUSec;
- int leap;
- int precision;
- int nsamples;
- volatile int valid;
- unsigned clockTimeStampNSec; /* Unsigned ns timestamps */
- unsigned receiveTimeStampNSec; /* Unsigned ns timestamps */
- int dummy[8];
+ int mode; /* 0 - if valid is set:
+ * use values,
+ * clear valid
+ * 1 - if valid is set:
+ * if count before and after read of values is equal,
+ * use values
+ * clear valid
+ */
+ volatile int count;
+ time_t clockTimeStampSec;
+ int clockTimeStampUSec;
+ time_t receiveTimeStampSec;
+ int receiveTimeStampUSec;
+ int leap;
+ int precision;
+ int nsamples;
+ volatile int valid;
+ unsigned clockTimeStampNSec; // Unsigned ns timestamps
+ unsigned receiveTimeStampNSec; // Unsigned ns timestamps
+ int dummy[8];
};
struct shmunit {
- struct shmTime *shm; /* pointer to shared memory segment */
- int forall; /* access for all UIDs? */
-
- /* debugging/monitoring counters - reset when printed */
- int ticks; /* number of attempts to read data*/
- int good; /* number of valid samples */
- int notready; /* number of peeks without data ready */
- int bad; /* number of invalid samples */
- int clash; /* number of access clashes while reading */
-
- time_t max_delta; /* difference limit */
- time_t max_delay; /* age/stale limit */
+ struct shmTime *shm; // pointer to shared memory segment
+ int forall; // access for all UIDs?
+
+ // debugging/monitoring counters - reset when printed
+ int ticks; // number of attempts to read data
+ int good; // number of valid samples
+ int notready; // number of peeks without data ready
+ int bad; // number of invalid samples
+ int clash; // number of access clashes while reading
+
+ time_t max_delta; // difference limit
+ time_t max_delay; // age/stale limit
};
static struct shmTime*
getShmTime(
- int unit,
- bool forall
- )
+ int unit,
+ bool forall
+ )
{
- struct shmTime *p = NULL;
-
- int shmid;
-
- /* 0x4e545030 is NTP0.
- * Big units will give non-ascii but that's OK
- * as long as everybody does it the same way.
- */
- shmid=shmget(0x4e545030 + unit, sizeof (struct shmTime),
- IPC_CREAT | (forall ? 0666 : 0600));
- if (shmid == -1) { /* error */
- msyslog(LOG_ERR, "REFCLOCK: SHM shmget (unit %d): %s", unit, strerror(errno));
- return NULL;
- }
- p = (struct shmTime *)shmat (shmid, 0, 0);
- if (p == (struct shmTime *)-1) { /* error */
- msyslog(LOG_ERR, "REFCLOCK: SHM shmat (unit %d): %s", unit, strerror(errno));
- return NULL;
- }
-
- return p;
+ struct shmTime *p = NULL;
+
+ int shmid;
+
+ /* 0x4e545030 is NTP0.
+ * Big units will give non-ascii but that's OK
+ * as long as everybody does it the same way.
+ */
+ shmid=shmget(0x4e545030 + unit, sizeof (struct shmTime),
+ IPC_CREAT | (forall ? 0666 : 0600));
+ if (shmid == -1) { // error
+ msyslog(LOG_ERR, "REFCLOCK: SHM shmget (unit %d): %s", unit, strerror(errno));
+ return NULL;
+ }
+ p = (struct shmTime *)shmat (shmid, 0, 0);
+ if (p == (struct shmTime *)-1) { // error
+ msyslog(LOG_ERR, "REFCLOCK: SHM shmat (unit %d): %s", unit, strerror(errno));
+ return NULL;
+ }
+
+ return p;
}
@@ -153,44 +153,44 @@ getShmTime(
*/
static bool
shm_start(
- int unit,
- struct peer *peer
- )
+ int unit,
+ struct peer *peer
+ )
{
- struct refclockproc * const pp = peer->procptr;
- struct shmunit * const up = emalloc_zero(sizeof(*up));
-
- pp->io.clock_recv = NULL;
- pp->io.srcclock = peer;
- pp->io.datalen = 0;
- pp->io.fd = -1;
-
- up->forall = (unit >= 2) && !(peer->cfg.mode & SHM_MODE_PRIVATE);
-
- up->shm = getShmTime(unit, up->forall);
-
- /*
- * Initialize miscellaneous peer variables
- */
- memcpy((char *)&pp->refid, REFID, REFIDLEN);
- peer->sstclktype = CTL_SST_TS_UHF;
- if (up->shm != 0) {
- pp->unitptr = up;
- up->shm->precision = PRECISION;
- peer->precision = (int8_t)up->shm->precision;
- up->shm->valid = 0;
- up->shm->nsamples = NSAMPLES;
- pp->clockname = NAME;
- pp->clockdesc = DESCRIPTION;
- /* items to be changed later in 'shm_control()': */
- up->max_delay = 5;
- up->max_delta = 4 * SECSPERHR;
- return true;
- } else {
- free(up);
- pp->unitptr = NULL;
- return false;
- }
+ struct refclockproc * const pp = peer->procptr;
+ struct shmunit * const up = emalloc_zero(sizeof(*up));
+
+ pp->io.clock_recv = NULL;
+ pp->io.srcclock = peer;
+ pp->io.datalen = 0;
+ pp->io.fd = -1;
+
+ up->forall = (unit >= 2) && !(peer->cfg.mode & SHM_MODE_PRIVATE);
+
+ up->shm = getShmTime(unit, up->forall);
+
+ /*
+ * Initialize miscellaneous peer variables
+ */
+ memcpy((char *)&pp->refid, REFID, REFIDLEN);
+ peer->sstclktype = CTL_SST_TS_UHF;
+ if (up->shm != 0) {
+ pp->unitptr = up;
+ up->shm->precision = PRECISION;
+ peer->precision = (int8_t)up->shm->precision;
+ up->shm->valid = 0;
+ up->shm->nsamples = NSAMPLES;
+ pp->clockname = NAME;
+ pp->clockdesc = DESCRIPTION;
+ // items to be changed later in 'shm_control()':
+ up->max_delay = 5;
+ up->max_delta = 4 * SECSPERHR;
+ return true;
+ } else {
+ free(up);
+ pp->unitptr = NULL;
+ return false;
+ }
}
@@ -203,28 +203,28 @@ shm_start(
*/
static void
shm_control(
- int unit,
- const struct refclockstat * in_st,
- struct refclockstat * out_st,
- struct peer * peer
- )
+ int unit,
+ const struct refclockstat * in_st,
+ struct refclockstat * out_st,
+ struct peer * peer
+ )
{
- struct refclockproc * const pp = peer->procptr;
- struct shmunit * const up = pp->unitptr;
-
- UNUSED_ARG(unit);
- UNUSED_ARG(in_st);
- UNUSED_ARG(out_st);
- if (NULL == up) {
- return;
- }
- if (!(pp->sloppyclockflag & CLK_FLAG1)) {
- up->max_delta = 0;
- } else if (pp->fudgetime2 < 1. || pp->fudgetime2 > SECSPERDAY) {
- up->max_delta = 4 * SECSPERHR;
- } else {
- up->max_delta = (time_t)floor(pp->fudgetime2 + 0.5);
- }
+ struct refclockproc * const pp = peer->procptr;
+ struct shmunit * const up = pp->unitptr;
+
+ UNUSED_ARG(unit);
+ UNUSED_ARG(in_st);
+ UNUSED_ARG(out_st);
+ if (NULL == up) {
+ return;
+ }
+ if (!(pp->sloppyclockflag & CLK_FLAG1)) {
+ up->max_delta = 0;
+ } else if (pp->fudgetime2 < 1. || pp->fudgetime2 > SECSPERDAY) {
+ up->max_delta = 4 * SECSPERHR;
+ } else {
+ up->max_delta = (time_t)floor(pp->fudgetime2 + 0.5);
+ }
}
@@ -233,18 +233,18 @@ shm_control(
*/
static void
shm_shutdown(
- struct refclockproc * pp
- )
+ struct refclockproc * pp
+ )
{
- struct shmunit * const up = pp->unitptr;
+ struct shmunit * const up = pp->unitptr;
- if (NULL == up) {
- return;
- }
+ if (NULL == up) {
+ return;
+ }
- (void)shmdt((char *)up->shm);
+ (void)shmdt((char *)up->shm);
- free(up);
+ free(up);
}
@@ -253,190 +253,190 @@ shm_shutdown(
*/
static void
shm_poll(
- int unit,
- struct peer *peer
- )
+ int unit,
+ struct peer *peer
+ )
{
- struct refclockproc * const pp = peer->procptr;
- struct shmunit * const up = pp->unitptr;
- int major_error;
+ struct refclockproc * const pp = peer->procptr;
+ struct shmunit * const up = pp->unitptr;
+ int major_error;
- pp->polls++;
+ pp->polls++;
- /* get dominant reason if we have no samples at all */
- major_error = max(up->notready, up->bad);
- major_error = max(major_error, up->clash);
+ // get dominant reason if we have no samples at all
+ major_error = max(up->notready, up->bad);
+ major_error = max(major_error, up->clash);
/*
* Process median filter samples. If none received, see what
* happened, tell the core and keep going.
*/
if (pp->coderecv != pp->codeproc) {
- /* have some samples, everything OK */
- pp->lastref = pp->lastrec;
- refclock_receive(peer);
- } else if (NULL == up->shm) { /* is this possible at all? */
- /* we're out of business without SHM access */
- refclock_report(peer, CEVNT_FAULT);
- } else if (major_error == up->clash) {
- /* too many collisions is like a bad signal */
+ // have some samples, everything OK
+ pp->lastref = pp->lastrec;
+ refclock_receive(peer);
+ } else if (NULL == up->shm) { // is this possible at all?
+ // we're out of business without SHM access
+ refclock_report(peer, CEVNT_FAULT);
+ } else if (major_error == up->clash) {
+ // too many collisions is like a bad signal
refclock_report(peer, CEVNT_PROP);
- } else if (major_error == up->bad) {
- /* too much stale/bad/garbled data */
+ } else if (major_error == up->bad) {
+ // too much stale/bad/garbled data
refclock_report(peer, CEVNT_BADREPLY);
- } else {
- /* in any other case assume it's just a timeout */
+ } else {
+ // in any other case assume it's just a timeout
refclock_report(peer, CEVNT_TIMEOUT);
}
- /* shm_clockstats() clears the tallies, so it must be last... */
- shm_clockstats(unit, peer);
+ // shm_clockstats() clears the tallies, so it must be last...
+ shm_clockstats(unit, peer);
}
enum segstat_t {
- OK, NO_SEGMENT, NOT_READY, BAD_MODE, CLASH
+ OK, NO_SEGMENT, NOT_READY, BAD_MODE, CLASH
};
struct shm_stat_t {
- int status;
- int mode;
- struct timespec tvc, tvr, tvt;
- int precision;
- int leap;
+ int status;
+ int mode;
+ struct timespec tvc, tvr, tvt;
+ int precision;
+ int leap;
};
static inline void memory_barrier(void) {
#if defined(HAVE_STDATOMIC_H) && !defined(__COVERITY__)
- atomic_thread_fence(memory_order_seq_cst);
-#endif /* HAVE_STDATOMIC_H */
+ atomic_thread_fence(memory_order_seq_cst);
+#endif // HAVE_STDATOMIC_H
}
static enum segstat_t shm_query(volatile struct shmTime *shm_in, struct shm_stat_t *shm_stat) {
-/* try to grab a sample from the specified SHM segment */
- volatile struct shmTime shmcopy, *shm = shm_in;
- volatile int cnt;
-
- unsigned int cns_new, rns_new;
-
- /*
- * This is the main routine. It snatches the time from the shm
- * board and tacks on a local timestamp.
- */
- if (shm == NULL) {
- shm_stat->status = NO_SEGMENT;
- return NO_SEGMENT;
- }
-
- /*@-type@*//* splint is confused about struct timespec */
- shm_stat->tvc.tv_sec = shm_stat->tvc.tv_nsec = 0;
- {
- time_t now;
-
- time(&now);
- shm_stat->tvc.tv_sec = now;
- }
-
- /* relying on word access to be atomic here */
- if (shm->valid == 0) {
- shm_stat->status = NOT_READY;
- return NOT_READY;
- }
-
- cnt = shm->count;
-
- /*
- * This is proof against concurrency issues if either
- * (a) the memory_barrier() call works on this host, or
- * (b) memset compiles to an uninterruptible single-instruction bitblt.
- */
- memory_barrier();
- /* structure copy, to preserve volatile */
- shmcopy = *shm;
- shm->valid = 0;
- memory_barrier();
-
- /*
- * Clash detection in case neither (a) nor (b) was true.
- * Not supported in mode 0, and word access to the count field
- * must be atomic for this to work.
- */
- if (shmcopy.mode > 0 && cnt != shm->count) {
- shm_stat->status = CLASH;
- return (enum segstat_t)shm_stat->status;
- }
-
- shm_stat->status = OK;
- shm_stat->mode = shmcopy.mode;
-
- switch (shmcopy.mode) {
- case 0:
- shm_stat->tvr.tv_sec = shmcopy.receiveTimeStampSec;
- shm_stat->tvr.tv_nsec = shmcopy.receiveTimeStampUSec * 1000;
- rns_new = shmcopy.receiveTimeStampNSec;
- shm_stat->tvt.tv_sec = shmcopy.clockTimeStampSec;
- shm_stat->tvt.tv_nsec = shmcopy.clockTimeStampUSec * 1000;
- cns_new = shmcopy.clockTimeStampNSec;
-
- /* Since the following comparisons are between unsigned
- ** variables they are always well defined, and any
- ** (signed) underflow will turn into very large unsigned
- ** values, well above the 1000 cutoff.
- **
- ** Note: The usecs *must* be a *truncated*
- ** representation of the nsecs. This code will fail for
- ** *rounded* usecs, and the logic to deal with
- ** wrap-arounds in the presence of rounded values is
- ** much more convoluted.
- */
- if ( ((cns_new - (unsigned)shm_stat->tvt.tv_nsec) < 1000)
- && ((rns_new - (unsigned)shm_stat->tvr.tv_nsec) < 1000)) {
- shm_stat->tvt.tv_nsec = (long)cns_new;
- shm_stat->tvr.tv_nsec = (long)rns_new;
- }
- /* At this point shm_stat->tvr and shm_stat->tvt contain valid ns-level
- ** timestamps, possibly generated by extending the old
- ** us-level timestamps
- */
- break;
-
- case 1:
-
- shm_stat->tvr.tv_sec = shmcopy.receiveTimeStampSec;
- shm_stat->tvr.tv_nsec = shmcopy.receiveTimeStampUSec * 1000;
- rns_new = shmcopy.receiveTimeStampNSec;
- shm_stat->tvt.tv_sec = shmcopy.clockTimeStampSec;
- shm_stat->tvt.tv_nsec = shmcopy.clockTimeStampUSec * 1000;
- cns_new = shmcopy.clockTimeStampNSec;
-
- /* See the case above for an explanation of the
- ** following test.
- */
- if ( ((cns_new - (unsigned)shm_stat->tvt.tv_nsec) < 1000)
- && ((rns_new - (unsigned)shm_stat->tvr.tv_nsec) < 1000)) {
- shm_stat->tvt.tv_nsec = (long)cns_new;
- shm_stat->tvr.tv_nsec = (long)rns_new;
- }
- /* At this point shm_stat->tvr and shm_stat->tvt contains valid ns-level
- ** timestamps, possibly generated by extending the old
- ** us-level timestamps
- */
- break;
-
- default:
- shm_stat->status = BAD_MODE;
- break;
- }
- /*@-type@*/
-
- /*
- * leap field is not a leap offset but a leap notification code.
- * The values are magic numbers used by NTP and set by GPSD, if at all, in
- * the subframe code.
- */
- shm_stat->leap = shmcopy.leap;
- shm_stat->precision = shmcopy.precision;
-
- return (enum segstat_t)shm_stat->status;
+// try to grab a sample from the specified SHM segment
+ volatile struct shmTime shmcopy, *shm = shm_in;
+ volatile int cnt;
+
+ unsigned int cns_new, rns_new;
+
+ /*
+ * This is the main routine. It snatches the time from the shm
+ * board and tacks on a local timestamp.
+ */
+ if (shm == NULL) {
+ shm_stat->status = NO_SEGMENT;
+ return NO_SEGMENT;
+ }
+
+ // @-type@/* splint is confused about struct timespec */
+ shm_stat->tvc.tv_sec = shm_stat->tvc.tv_nsec = 0;
+ {
+ time_t now;
+
+ time(&now);
+ shm_stat->tvc.tv_sec = now;
+ }
+
+ // relying on word access to be atomic here
+ if (shm->valid == 0) {
+ shm_stat->status = NOT_READY;
+ return NOT_READY;
+ }
+
+ cnt = shm->count;
+
+ /*
+ * This is proof against concurrency issues if either
+ * (a) the memory_barrier() call works on this host, or
+ * (b) memset compiles to an uninterruptible single-instruction bitblt.
+ */
+ memory_barrier();
+ // structure copy, to preserve volatile
+ shmcopy = *shm;
+ shm->valid = 0;
+ memory_barrier();
+
+ /*
+ * Clash detection in case neither (a) nor (b) was true.
+ * Not supported in mode 0, and word access to the count field
+ * must be atomic for this to work.
+ */
+ if (shmcopy.mode > 0 && cnt != shm->count) {
+ shm_stat->status = CLASH;
+ return (enum segstat_t)shm_stat->status;
+ }
+
+ shm_stat->status = OK;
+ shm_stat->mode = shmcopy.mode;
+
+ switch (shmcopy.mode) {
+ case 0:
+ shm_stat->tvr.tv_sec = shmcopy.receiveTimeStampSec;
+ shm_stat->tvr.tv_nsec = shmcopy.receiveTimeStampUSec * 1000;
+ rns_new = shmcopy.receiveTimeStampNSec;
+ shm_stat->tvt.tv_sec = shmcopy.clockTimeStampSec;
+ shm_stat->tvt.tv_nsec = shmcopy.clockTimeStampUSec * 1000;
+ cns_new = shmcopy.clockTimeStampNSec;
+
+ /* Since the following comparisons are between unsigned
+ ** variables they are always well defined, and any
+ ** (signed) underflow will turn into very large unsigned
+ ** values, well above the 1000 cutoff.
+ **
+ ** Note: The usecs *must* be a *truncated*
+ ** representation of the nsecs. This code will fail for
+ ** *rounded* usecs, and the logic to deal with
+ ** wrap-arounds in the presence of rounded values is
+ ** much more convoluted.
+ */
+ if ( ((cns_new - (unsigned)shm_stat->tvt.tv_nsec) < 1000)
+ && ((rns_new - (unsigned)shm_stat->tvr.tv_nsec) < 1000)) {
+ shm_stat->tvt.tv_nsec = (long)cns_new;
+ shm_stat->tvr.tv_nsec = (long)rns_new;
+ }
+ /* At this point shm_stat->tvr and shm_stat->tvt contain valid ns-level
+ ** timestamps, possibly generated by extending the old
+ ** us-level timestamps
+ */
+ break;
+
+ case 1:
+
+ shm_stat->tvr.tv_sec = shmcopy.receiveTimeStampSec;
+ shm_stat->tvr.tv_nsec = shmcopy.receiveTimeStampUSec * 1000;
+ rns_new = shmcopy.receiveTimeStampNSec;
+ shm_stat->tvt.tv_sec = shmcopy.clockTimeStampSec;
+ shm_stat->tvt.tv_nsec = shmcopy.clockTimeStampUSec * 1000;
+ cns_new = shmcopy.clockTimeStampNSec;
+
+ /* See the case above for an explanation of the
+ ** following test.
+ */
+ if ( ((cns_new - (unsigned)shm_stat->tvt.tv_nsec) < 1000)
+ && ((rns_new - (unsigned)shm_stat->tvr.tv_nsec) < 1000)) {
+ shm_stat->tvt.tv_nsec = (long)cns_new;
+ shm_stat->tvr.tv_nsec = (long)rns_new;
+ }
+ /* At this point shm_stat->tvr and shm_stat->tvt contains valid ns-level
+ ** timestamps, possibly generated by extending the old
+ ** us-level timestamps
+ */
+ break;
+
+ default:
+ shm_stat->status = BAD_MODE;
+ break;
+ }
+ // @-type@
+
+ /*
+ * leap field is not a leap offset but a leap notification code.
+ * The values are magic numbers used by NTP and set by GPSD, if at all, in
+ * the subframe code.
+ */
+ shm_stat->leap = shmcopy.leap;
+ shm_stat->precision = shmcopy.precision;
+
+ return (enum segstat_t)shm_stat->status;
}
/*
@@ -446,139 +446,139 @@ static enum segstat_t shm_query(volatile struct shmTime *shm_in, struct shm_stat
*/
static void
shm_timer(
- int unit,
- struct peer *peer
- )
+ int unit,
+ struct peer *peer
+ )
{
- struct refclockproc * const pp = peer->procptr;
- struct shmunit * const up = pp->unitptr;
-
- volatile struct shmTime *shm;
-
- l_fp tsrcv;
- l_fp tsref;
- int c;
- time_t tt;
-
- enum segstat_t status;
- struct shm_stat_t shm_stat;
-
- up->ticks++;
- if ((shm = up->shm) == NULL) {
- /* try to map again - this may succeed if meanwhile some-
- body has ipcrm'ed the old (unaccessible) shared mem segment */
- shm = up->shm = getShmTime(unit, up->forall);
- if (shm == NULL) {
- DPRINT(1, ("%s: no SHM segment\n",refclock_name(peer)));
- return;
- }
- }
-
- /* query the segment, atomically */
- status = shm_query(shm, &shm_stat);
-
- switch (status) {
- case OK:
- DPRINT(2, ("%s: SHM(%d) type %d sample\n",
- refclock_name(peer), unit, shm_stat.mode));
- break;
- case NO_SEGMENT:
- /* should never happen, but is harmless */
- return;
- case NOT_READY:
- DPRINT(1, ("%s: SHM(%d) not ready\n",refclock_name(peer), unit));
- up->notready++;
- return;
- case BAD_MODE:
- DPRINT(1, ("%s: SHM(%d) type blooper, mode=%d\n",
- refclock_name(peer), unit, shm->mode));
- up->bad++;
- msyslog (LOG_ERR, "SHM(%d): bad mode found in shared memory: %d",
- unit, shm->mode);
- return;
- case CLASH:
- DPRINT(1, ("%s: type 1 access clash\n",
- refclock_name(peer)));
- msyslog (LOG_NOTICE, "SHM(%d): access clash in shared memory",
+ struct refclockproc * const pp = peer->procptr;
+ struct shmunit * const up = pp->unitptr;
+
+ volatile struct shmTime *shm;
+
+ l_fp tsrcv;
+ l_fp tsref;
+ int c;
+ time_t tt;
+
+ enum segstat_t status;
+ struct shm_stat_t shm_stat;
+
+ up->ticks++;
+ if ((shm = up->shm) == NULL) {
+ /* try to map again - this may succeed if meanwhile some-
+ body has ipcrm'ed the old (unaccessible) shared mem segment */
+ shm = up->shm = getShmTime(unit, up->forall);
+ if (shm == NULL) {
+ DPRINT(1, ("%s: no SHM segment\n",refclock_name(peer)));
+ return;
+ }
+ }
+
+ // query the segment, atomically
+ status = shm_query(shm, &shm_stat);
+
+ switch (status) {
+ case OK:
+ DPRINT(2, ("%s: SHM(%d) type %d sample\n",
+ refclock_name(peer), unit, shm_stat.mode));
+ break;
+ case NO_SEGMENT:
+ // should never happen, but is harmless
+ return;
+ case NOT_READY:
+ DPRINT(1, ("%s: SHM(%d) not ready\n",refclock_name(peer), unit));
+ up->notready++;
+ return;
+ case BAD_MODE:
+ DPRINT(1, ("%s: SHM(%d) type blooper, mode=%d\n",
+ refclock_name(peer), unit, shm->mode));
+ up->bad++;
+ msyslog (LOG_ERR, "SHM(%d): bad mode found in shared memory: %d",
+ unit, shm->mode);
+ return;
+ case CLASH:
+ DPRINT(1, ("%s: type 1 access clash\n",
+ refclock_name(peer)));
+ msyslog (LOG_NOTICE, "SHM(%d): access clash in shared memory",
unit);
- up->clash++;
- return;
- default:
- DPRINT(1, ("%s: internal error, unknown SHM(%d) fetch status\n",
- refclock_name(peer), unit));
- msyslog (LOG_NOTICE, "internal error, unknown SHM(%d) fetch status",
+ up->clash++;
+ return;
+ default:
+ DPRINT(1, ("%s: internal error, unknown SHM(%d) fetch status\n",
+ refclock_name(peer), unit));
+ msyslog (LOG_NOTICE, "internal error, unknown SHM(%d) fetch status",
unit);
- up->bad++;
- return;
- }
-
-
- /*
- * Add POSIX UTC seconds and fractional seconds as a timecode.
- * We used to unpack this to calendar time, but it is bad
- * practice for the driver to pretend to know calendar time;
- * that interpretation is best left to higher levels.
- */
- /* a_lastcode is seen as timecode with: ntpq -c cv [associd] */
- c = snprintf(pp->a_lastcode, sizeof(pp->a_lastcode), "%ld.%09ld",
- (long)shm_stat.tvt.tv_sec, (long)shm_stat.tvt.tv_nsec);
- pp->lencode = (c < (int)sizeof(pp->a_lastcode)) ? c : 0;
-
- /* check 1: age control of local time stamp */
- tt = shm_stat.tvc.tv_sec - shm_stat.tvr.tv_sec;
- if (tt < 0 || tt > up->max_delay) {
- DPRINT(1, ("%s:SHM(%d) stale/bad receive time, delay=%llds\n",
- refclock_name(peer), unit, (long long)tt));
- up->bad++;
- msyslog (LOG_ERR,
+ up->bad++;
+ return;
+ }
+
+
+ /*
+ * Add POSIX UTC seconds and fractional seconds as a timecode.
+ * We used to unpack this to calendar time, but it is bad
+ * practice for the driver to pretend to know calendar time;
+ * that interpretation is best left to higher levels.
+ */
+ // a_lastcode is seen as timecode with: ntpq -c cv [associd]
+ c = snprintf(pp->a_lastcode, sizeof(pp->a_lastcode), "%ld.%09ld",
+ (long)shm_stat.tvt.tv_sec, (long)shm_stat.tvt.tv_nsec);
+ pp->lencode = (c < (int)sizeof(pp->a_lastcode)) ? c : 0;
+
+ // check 1: age control of local time stamp
+ tt = shm_stat.tvc.tv_sec - shm_stat.tvr.tv_sec;
+ if (tt < 0 || tt > up->max_delay) {
+ DPRINT(1, ("%s:SHM(%d) stale/bad receive time, delay=%llds\n",
+ refclock_name(peer), unit, (long long)tt));
+ up->bad++;
+ msyslog (LOG_ERR,
"SHM(%d): stale/bad receive time, delay=%llds",
- unit, (long long)tt);
- return;
- }
-
- /* check 2: delta check */
- tt = shm_stat.tvr.tv_sec - shm_stat.tvt.tv_sec - (shm_stat.tvr.tv_nsec < shm_stat.tvt.tv_nsec);
- if (tt < 0) {
- tt = -tt;
- }
- if (up->max_delta > 0 && tt > up->max_delta) {
- DPRINT(1, ("%s: SHM(%d) diff limit exceeded, delta=%llds\n",
- refclock_name(peer), unit, (long long)tt));
- up->bad++;
- msyslog (LOG_ERR,
+ unit, (long long)tt);
+ return;
+ }
+
+ // check 2: delta check
+ tt = shm_stat.tvr.tv_sec - shm_stat.tvt.tv_sec - (shm_stat.tvr.tv_nsec < shm_stat.tvt.tv_nsec);
+ if (tt < 0) {
+ tt = -tt;
+ }
+ if (up->max_delta > 0 && tt > up->max_delta) {
+ DPRINT(1, ("%s: SHM(%d) diff limit exceeded, delta=%llds\n",
+ refclock_name(peer), unit, (long long)tt));
+ up->bad++;
+ msyslog (LOG_ERR,
"SHM(%d): difference limit exceeded, delta=%llds\n",
- unit, (long long)tt);
- return;
- }
-
- /* if we really made it to this point... we're winners! */
- DPRINT(2, ("%s: SHM(%d) feeding data\n", refclock_name(peer), unit));
- tsrcv = tspec_stamp_to_lfp(shm_stat.tvr);
- tsref = tspec_stamp_to_lfp(shm_stat.tvt);
- pp->leap = (uint8_t)shm_stat.leap;
- peer->precision = (int8_t)shm_stat.precision;
- refclock_process_offset(pp, tsref, tsrcv, pp->fudgetime1);
- up->good++;
+ unit, (long long)tt);
+ return;
+ }
+
+ // if we really made it to this point... we're winners!
+ DPRINT(2, ("%s: SHM(%d) feeding data\n", refclock_name(peer), unit));
+ tsrcv = tspec_stamp_to_lfp(shm_stat.tvr);
+ tsref = tspec_stamp_to_lfp(shm_stat.tvt);
+ pp->leap = (uint8_t)shm_stat.leap;
+ peer->precision = (int8_t)shm_stat.precision;
+ refclock_process_offset(pp, tsref, tsrcv, pp->fudgetime1);
+ up->good++;
}
/*
* shm_clockstats - dump and reset counters
*/
static void shm_clockstats(
- int unit,
- struct peer *peer
- )
+ int unit,
+ struct peer *peer
+ )
{
- struct refclockproc * const pp = peer->procptr;
- struct shmunit * const up = pp->unitptr;
-
- UNUSED_ARG(unit);
- if (pp->sloppyclockflag & CLK_FLAG4) {
- mprintf_clock_stats(
- peer, "%3d %3d %3d %3d %3d",
- up->ticks, up->good, up->notready,
- up->bad, up->clash);
- }
- up->ticks = up->good = up->notready = up->bad = up->clash = 0;
+ struct refclockproc * const pp = peer->procptr;
+ struct shmunit * const up = pp->unitptr;
+
+ UNUSED_ARG(unit);
+ if (pp->sloppyclockflag & CLK_FLAG4) {
+ mprintf_clock_stats(
+ peer, "%3d %3d %3d %3d %3d",
+ up->ticks, up->good, up->notready,
+ up->bad, up->clash);
+ }
+ up->ticks = up->good = up->notready = up->bad = up->clash = 0;
}
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/-/compare/9eb5ae85b088bad703d54013b1cd174636c6c551...95263fdc6e49b21498ddfdef453ee6ca2a561d58
--
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/-/compare/9eb5ae85b088bad703d54013b1cd174636c6c551...95263fdc6e49b21498ddfdef453ee6ca2a561d58
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ntpsec.org/pipermail/vc/attachments/20260806/9257fd15/attachment-0001.htm>
More information about the vc
mailing list