On Wed, Jun 29, 2022 at 09:50:39AM +0000, Job Snijders wrote:
> On Wed, Jun 29, 2022 at 09:18:08AM +0000, Job Snijders wrote:
> > Add a '-m' monotonic clock option
> 
> I misunderstood what the moreutils ts -m option was doing, below is a
> different version, which is 'resistant' against the wallclock jump back
> and forth.
> 
> Index: ts.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/ts/ts.1,v
> retrieving revision 1.1
> diff -u -p -r1.1 ts.1
> --- ts.1      29 Jun 2022 08:39:49 -0000      1.1
> +++ ts.1      29 Jun 2022 09:49:57 -0000
> @@ -23,6 +23,7 @@
>  .Sh SYNOPSIS
>  .Nm ts
>  .Op Fl i | s
> +.Op Fl m
>  .Op Ar format
>  .Sh DESCRIPTION
>  When invoked, the
> @@ -33,6 +34,8 @@ The options are as follows:
>  .Bl -tag -width Ds
>  .It Fl i
>  Display time elapsed since the last timestamp.
> +.It Fl m
> +Use the system's monotonic clock.

I would prefer this is discribed differently. Since it does not show the
system's monotonic clock. That is a detail. It bases the timestamps based
on the monotonic clock instead of the regular wall clock time.

>  .It Fl s
>  Display time elapsed since the start of the program.
>  .El
> Index: ts.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ts/ts.c,v
> retrieving revision 1.1
> diff -u -p -r1.1 ts.c
> --- ts.c      29 Jun 2022 08:39:49 -0000      1.1
> +++ ts.c      29 Jun 2022 09:49:57 -0000
> @@ -38,25 +38,32 @@ static void __dead         usage(void);
>  int
>  main(int argc, char *argv[])
>  {
> -     int iflag, sflag;
> +     int iflag, mflag, sflag;
>       int ch, prev;
> -     struct timespec start, now, elapsed;
> +     struct timespec rstart, start, now, elapsed;
>       struct tm *lt, tm;
> +     int clock = CLOCK_REALTIME;
>  
>       if (pledge("stdio", NULL) == -1)
>               err(1, "pledge");
>  
> -     iflag = sflag = 0;
> +     iflag = mflag = sflag = 0;
>  
> -     while ((ch = getopt(argc, argv, "is")) != -1) {
> +     while ((ch = getopt(argc, argv, "ims")) != -1) {
>               switch (ch) {
>               case 'i':
>                       iflag = 1;
>                       format = "%H:%M:%S";
> +                     clock = CLOCK_MONOTONIC;
> +                     break;
> +             case 'm':
> +                     mflag = 1;
> +                     clock = CLOCK_MONOTONIC;
>                       break;
>               case 's':
>                       sflag = 1;
>                       format = "%H:%M:%S";
> +                     clock = CLOCK_MONOTONIC;
>                       break;
>               default:
>                       usage();
> @@ -81,22 +88,29 @@ main(int argc, char *argv[])
>       if ((outbuf = calloc(1, bufsize)) == NULL)
>               err(1, NULL);
>  
> +     clock_gettime(CLOCK_REALTIME, &rstart);
>       clock_gettime(CLOCK_MONOTONIC, &start);
>  
>       for (prev = '\n'; (ch = getchar()) != EOF; prev = ch) {
>               if (prev == '\n') {
> +                     if (clock_gettime(clock, &now))
> +                             err(1, "clock_gettime");
>                       if (iflag || sflag) {
> -                             if (clock_gettime(CLOCK_MONOTONIC, &now))
> -                                     err(1, "clock_gettime");
>                               timespecsub(&now, &start, &elapsed);
>                               if (gmtime_r(&elapsed.tv_sec, &tm) == NULL)
>                                       err(1, "gmtime_r");
>                               if (iflag)
> -                                     clock_gettime(CLOCK_MONOTONIC, &start);
> +                                     if (clock_gettime(clock, &start))
> +                                             err(1, "clock_gettime");
>                               fmtfmt(&tm, elapsed.tv_nsec);
> +                     } else if (mflag) {
> +                             timespecsub(&now, &start, &elapsed);
> +                             timespecadd(&rstart, &elapsed, &now);
> +                             lt = localtime(&now.tv_sec);
> +                             if (lt == NULL)
> +                                     err(1, "localtime");
> +                             fmtfmt(lt, now.tv_nsec);
>                       } else {
> -                             if (clock_gettime(CLOCK_REALTIME, &now))
> -                                     err(1, "clock_gettime");
>                               lt = localtime(&now.tv_sec);
>                               if (lt == NULL)
>                                       err(1, "localtime");
> @@ -115,7 +129,7 @@ main(int argc, char *argv[])
>  static void __dead
>  usage(void)
>  {
> -     fprintf(stderr, "usage: %s [-i | -s] [format]\n", getprogname());
> +     fprintf(stderr, "usage: %s [-i | -s] [-m] [format]\n", getprogname());
>       exit(1);
>  }
>  
> 

Code is OK claudio@

-- 
:wq Claudio

Reply via email to