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