To enable handling lstab in the same way by different pps sources, move update_leapsecond_table function from the nmea_pps_source to the generic lstab file. This also required moving leapfile filename and its modification time to the struct lstab.
Signed-off-by: Maciek Machnikowski <mac...@machnikowski.net> Reviewed-by: Jacob Keller <jacob.e.kel...@intel.com> --- lstab.c | 52 ++++++++++++++++++++++++++++++++++++++++ lstab.h | 8 +++++++ ts2phc_nmea_pps_source.c | 51 ++++----------------------------------- 3 files changed, 64 insertions(+), 47 deletions(-) diff --git a/lstab.c b/lstab.c index 881b5d3..62429ee 100644 --- a/lstab.c +++ b/lstab.c @@ -6,6 +6,7 @@ #include <inttypes.h> #include <stdio.h> #include <stdlib.h> +#include <sys/stat.h> #include "lstab.h" @@ -45,6 +46,8 @@ struct epoch_marker { struct lstab { struct epoch_marker lstab[N_LEAPS]; uint64_t expiration_utc; + const char *leapfile; + time_t lsfile_mtime; int length; }; @@ -157,6 +160,8 @@ static int lstab_read(struct lstab *lstab, const char *name) struct lstab *lstab_create(const char *filename) { struct lstab *lstab = calloc(1, sizeof(*lstab)); + struct stat statbuf; + int err; if (!lstab) { return NULL; @@ -166,12 +171,54 @@ struct lstab *lstab_create(const char *filename) free(lstab); return NULL; } + lstab->leapfile = filename; + + err = stat(lstab->leapfile, &statbuf); + if (err) { + fprintf(stderr, "file status failed on %s: %m", + lstab->leapfile); + free(lstab); + return NULL; + } + + lstab->lsfile_mtime = statbuf.st_mtim.tv_sec; + } else { lstab_init(lstab); } return lstab; } +static int update_leapsecond_table(struct lstab *lstab) +{ + const char* leapfile; + struct stat statbuf; + int err; + + if (!lstab->leapfile) { + return 0; + } + err = stat(lstab->leapfile, &statbuf); + if (err) { + fprintf(stderr, "file status failed on %s: %m", + lstab->leapfile); + return -1; + } + if (lstab->lsfile_mtime == statbuf.st_mtim.tv_sec) { + return 0; + } + printf("updating leap seconds file\n"); + leapfile = lstab->leapfile; + lstab_destroy(lstab); + + lstab = lstab_create(leapfile); + if (!lstab) { + return -1; + } + + return 0; +} + void lstab_destroy(struct lstab *lstab) { free(lstab); @@ -182,6 +229,11 @@ enum lstab_result lstab_utc2tai(struct lstab *lstab, uint64_t utctime, { int epoch = -1, index, next; + if (update_leapsecond_table(lstab)) { + fprintf(stderr, "Failed to update leap seconds table"); + return LSTAB_UNKNOWN; + } + for (index = lstab->length - 1; index > -1; index--) { if (utctime >= lstab->lstab[index].utc) { epoch = index; diff --git a/lstab.h b/lstab.h index 3811aed..43a5ec0 100644 --- a/lstab.h +++ b/lstab.h @@ -19,6 +19,14 @@ struct lstab; */ struct lstab *lstab_create(const char *filename); +/** + * Updates an instance of a leap second table from the associated file. + * @param lstab Pointer to lstab to be updated. + * @return 0 if lstab is up to date, don't use a file or was successfully updated. + * non-zero - on error + */ +int update_leapsecond_table(struct lstab *lstab); + /** * Destroys a leap second table instance. * @param lstab A pointer obtained via lstab_create(). diff --git a/ts2phc_nmea_pps_source.c b/ts2phc_nmea_pps_source.c index 8ea26bf..3a4267d 100644 --- a/ts2phc_nmea_pps_source.c +++ b/ts2phc_nmea_pps_source.c @@ -29,8 +29,6 @@ struct ts2phc_nmea_pps_source { struct ts2phc_pps_source pps_source; struct config *config; - const char *leapfile; - time_t lsfile_mtime; struct lstab *lstab; pthread_t worker; /* Protects anonymous struct fields, below, from concurrent access. */ @@ -144,34 +142,6 @@ static void *monitor_nmea_status(void *arg) return NULL; } -static int update_leapsecond_table(struct ts2phc_nmea_pps_source *s) -{ - struct stat statbuf; - int err; - - if (!s->leapfile) { - return 0; - } - err = stat(s->leapfile, &statbuf); - if (err) { - pr_err("nmea: file status failed on %s: %m", s->leapfile); - return -1; - } - if (s->lsfile_mtime == statbuf.st_mtim.tv_sec) { - return 0; - } - pr_info("nmea: updating leap seconds file"); - if (s->lstab) { - lstab_destroy(s->lstab); - } - s->lstab = lstab_create(s->leapfile); - if (!s->lstab) { - return -1; - } - s->lsfile_mtime = statbuf.st_mtim.tv_sec; - return 0; -} - static void ts2phc_nmea_pps_source_destroy(struct ts2phc_pps_source *src) { struct ts2phc_nmea_pps_source *s = @@ -225,11 +195,6 @@ static int ts2phc_nmea_pps_source_getppstime(struct ts2phc_pps_source *src, utc_time /= (int64_t) 1000000000; *ts = tmv_to_timespec(rmc); - if (update_leapsecond_table(m)) { - pr_err("nmea: failed to update leap seconds table"); - return -1; - } - result = lstab_utc2tai(m->lstab, utc_time, &tai_offset); switch (result) { case LSTAB_OK: @@ -254,28 +219,20 @@ struct ts2phc_pps_source *ts2phc_nmea_pps_source_create(struct ts2phc_private *p const char *dev) { struct ts2phc_nmea_pps_source *s; - struct stat statbuf; + const char* leapfile; int err; s = calloc(1, sizeof(*s)); if (!s) { return NULL; } - s->leapfile = config_get_string(priv->cfg, NULL, "leapfile"); - s->lstab = lstab_create(s->leapfile); + leapfile = config_get_string(priv->cfg, NULL, "leapfile"); + s->lstab = lstab_create(leapfile); if (!s->lstab) { free(s); return NULL; } - if (s->leapfile) { - err = stat(s->leapfile, &statbuf); - if (err) { - lstab_destroy(s->lstab); - free(s); - return NULL; - } - s->lsfile_mtime = statbuf.st_mtim.tv_sec; - } + s->pps_source.destroy = ts2phc_nmea_pps_source_destroy; s->pps_source.getppstime = ts2phc_nmea_pps_source_getppstime; s->config = priv->cfg; -- 2.34.1 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel