Commit 33a5f601 authored by Eric S. Raymond's avatar Eric S. Raymond
Browse files

Eliminate another union.

parent 1edced5c
......@@ -109,11 +109,7 @@
*/
#define PARSE_TCMAX 400 /* maximum addition data size */
typedef union
{
struct timeval tv; /* timeval - kernel view */
l_fp fp; /* fixed point - ntp view */
} timestamp_t;
typedef l_fp timestamp_t;
/*
* standard time stamp structure
......
......@@ -508,9 +508,9 @@ calc_usecdiff(
long delta_usec = 0;
l_fp delt;
delt = ref->fp;
setlfpsint(delt, lfpsint(delt) + offset);
delt -= base->fp;
delt = *ref;
bumplfpsint(delt, offset);
delt -= *base;
delta = lfp_stamp_to_tspec(delt, NULL);
delta_usec = 1000000 * (int32_t)delta.tv_sec + delta.tv_nsec/1000;
......@@ -532,7 +532,18 @@ snt_rawdcf(
last_tcode_t *t = (last_tcode_t *)parseio->parse_pdata;
long delta_usec = -1;
if (t != NULL && t->tminute.tv.tv_sec != 0) {
/*
* 2017-01-07: Emergency repair. This guard used to test
* t->tminute.tv.tv_sec, but that cannot have been right as
* that tv_sec field was never set anywhere outside the
* in-kernel Sun module (long discarded) while this code was
* reached in userspace. It is unknown whether replacing that
* test with the analogous one on an l_fp is correct. This
* problem was discovered when reducing the timestamp_t union
* - this was one of two references to the UNIX timestamp
* member.
*/
if (t != NULL && lfpuint(t->tminute) != 0) {
delta_usec = calc_usecdiff(ptime, &t->tminute, parseio->parse_index - 1);
if (delta_usec < 0)
delta_usec = -delta_usec;
......@@ -546,7 +557,7 @@ snt_rawdcf(
{
parseio->parse_dtime.parse_stime = *ptime;
bumplfpuint(parseio->parse_dtime.parse_time.fp, 1);
bumplfpuint(parseio->parse_dtime.parse_time, 1);
parseprintf(DD_RAWDCF,("parse: snt_rawdcf: time stamp synthesized offset %d seconds\n", parseio->parse_index - 1));
......@@ -585,7 +596,18 @@ inp_rawdcf(
if (t != NULL)
{
/* remember minute start sample time if timeouts occur in minute raster */
if (t->timeout.tv.tv_sec != 0)
/*
* 2017-01-07: Emergency repair. This used to test
* t->timeout.tv.tv_sec != 0, but that cannot have been
* right as the tv.tv_sec part of (what used to be) the
* timestamp_t union was only set in the long-discarded
* Sun kernel driver, and this could always be called
* from userspace. Problem discovered while eliminating
* the timestamp_t union; this was one of only two
* referebces to the timrspec member. It is unknown
* whether this change actually corrects the code.
*/
if (lfpuint(t->timeout) != 0)
{
delta_usec = calc_usecdiff(tstamp, &t->timeout, 60);
if (delta_usec < 0)
......
......@@ -35,8 +35,8 @@ parse_timedout(
l_fp delt;
delt = tstamp->fp;
delt -= parseio->parse_lastchar.fp;
delt = *tstamp;
delt -= parseio->parse_lastchar;
delta = lfp_uintv_to_tspec(delt);
if (cmp_tspec(delta, *del) == TIMESPEC_GREATER_THAN)
{
......@@ -481,7 +481,7 @@ updatetimeinfo(
parseprintf(DD_PARSE, ("updatetimeinfo status=0x%lx, time=%x\n",
(long)parseio->parse_dtime.parse_state,
lfpuint(parseio->parse_dtime.parse_time.fp)));
lfpuint(parseio->parse_dtime.parse_time)));
return CVT_OK; /* everything fine and dandy... */
}
......@@ -621,7 +621,7 @@ timepacket(
* time stamp
*/
struct timespec ts = {t, clock_time.usecond * 1000};
parseio->parse_dtime.parse_time.fp = tspec_stamp_to_lfp(ts);
parseio->parse_dtime.parse_time = tspec_stamp_to_lfp(ts);
parseio->parse_dtime.parse_format = format;
......
......@@ -1812,7 +1812,7 @@ local_input(
*/
count = rbufp->recv_length;
s = (unsigned char *)rbufp->recv_buffer;
ts.fp = rbufp->recv_time;
ts = rbufp->recv_time;
while (count--)
{
......@@ -1851,18 +1851,18 @@ local_input(
else
pts = pps_info.assert_timestamp;
setlfpuint(parse->parseio.parse_dtime.parse_ptime.fp, (uint32_t) (pts.tv_sec + JAN_1970));
setlfpuint(parse->parseio.parse_dtime.parse_ptime, (uint32_t) (pts.tv_sec + JAN_1970));
dtemp = (double) pts.tv_nsec / 1e9;
if (dtemp < 0.) {
dtemp += 1;
bumplfpuint(parse->parseio.parse_dtime.parse_ptime.fp, -1);
bumplfpuint(parse->parseio.parse_dtime.parse_ptime, -1);
}
if (dtemp > 1.) {
dtemp -= 1;
bumplfpuint(parse->parseio.parse_dtime.parse_ptime.fp, 1);
bumplfpuint(parse->parseio.parse_dtime.parse_ptime, 1);
}
setlfpfrac(parse->parseio.parse_dtime.parse_ptime.fp, (uint32_t)(dtemp * FRAC));
setlfpfrac(parse->parseio.parse_dtime.parse_ptime, (uint32_t)(dtemp * FRAC));
parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS;
#ifdef DEBUG
......@@ -1872,7 +1872,7 @@ local_input(
"parse: local_receive: fd %d PPSAPI seq %ld - PPS %s\n",
rbufp->fd,
(long)pps_info.assert_sequence + (long)pps_info.clear_sequence,
lfptoa(parse->parseio.parse_dtime.parse_ptime.fp, 6));
lfptoa(parse->parseio.parse_dtime.parse_ptime, 6));
}
#endif
}
......@@ -1975,12 +1975,12 @@ local_receive(
parse->peer->refclkunit,
(unsigned int)parsetime.parse_status,
(unsigned int)parsetime.parse_state,
(unsigned long)lfpuint(parsetime.parse_time.fp),
(unsigned long)lfpfrac(parsetime.parse_time.fp),
(unsigned long)lfpuint(parsetime.parse_stime.fp),
(unsigned long)lfpfrac(parsetime.parse_stime.fp),
(unsigned long)lfpuint(parsetime.parse_ptime.fp),
(unsigned long)lfpfrac(parsetime.parse_ptime.fp));
(unsigned long)lfpuint(parsetime.parse_time),
(unsigned long)lfpfrac(parsetime.parse_time),
(unsigned long)lfpuint(parsetime.parse_stime),
(unsigned long)lfpfrac(parsetime.parse_stime),
(unsigned long)lfpuint(parsetime.parse_ptime),
(unsigned long)lfpfrac(parsetime.parse_ptime));
}
#endif
......@@ -3037,8 +3037,8 @@ parse_control(
* we have a PPS and RS232 signal - calculate the skew
* WARNING: assumes on TIMECODE == PULSE (timecode after pulse)
*/
off = parse->timedata.parse_stime.fp;
off -= parse->timedata.parse_ptime.fp; /* true offset */
off = parse->timedata.parse_stime;
off -= parse->timedata.parse_ptime; /* true offset */
tt = add_var(&out->kv_list, 80, RO);
snprintf(tt, 80, "refclock_ppsskew=%s", lfptoms(off, 6));
}
......@@ -3047,20 +3047,20 @@ parse_control(
if (PARSE_PPS(parse->timedata.parse_state))
{
tt = add_var(&out->kv_list, 80, RO|DEF);
snprintf(tt, 80, "refclock_ppstime=\"%s\"", gmprettydate(parse->timedata.parse_ptime.fp));
snprintf(tt, 80, "refclock_ppstime=\"%s\"", gmprettydate(parse->timedata.parse_ptime));
}
start = tt = add_var(&out->kv_list, 128, RO|DEF);
tt = ap(start, 128, tt, "refclock_time=\"");
if (lfpuint(parse->timedata.parse_time.fp) == 0)
if (lfpuint(parse->timedata.parse_time) == 0)
{
ap(start, 128, tt, "<UNDEFINED>\"");
}
else
{
ap(start, 128, tt, "%s\"",
gmprettydate(parse->timedata.parse_time.fp));
gmprettydate(parse->timedata.parse_time));
}
if (!PARSE_GETTIMECODE(parse, &tmpctl))
......@@ -3467,8 +3467,8 @@ parse_process(
if (PARSE_TIMECODE(parsetime->parse_state))
{
rectime = parsetime->parse_stime.fp;
off = reftime = parsetime->parse_time.fp;
rectime = parsetime->parse_stime;
off = reftime = parsetime->parse_time;
off -= rectime; /* prepare for PPS adjustments logic */
......@@ -3500,7 +3500,7 @@ parse_process(
/*
* we have a PPS signal - much better than the RS232 stuff (we hope)
*/
offset = parsetime->parse_ptime.fp;
offset = parsetime->parse_ptime;
#ifdef DEBUG
if (debug > 3)
......@@ -3537,7 +3537,7 @@ parse_process(
/*
* time code describes pulse
*/
reftime = off = parsetime->parse_time.fp;
reftime = off = parsetime->parse_time;
off -= offset; /* true offset */
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment