[lttng-dev] [PATCH lttng-tools] Support minute and hour as time suffix

Jérémie Galarneau jeremie.galarneau at efficios.com
Tue Feb 12 11:22:22 EST 2019


Merged in master and stable-2.11.

Thanks!
Jérémie

On Fri, 14 Dec 2018 at 16:32, Jonathan Rajotte
<jonathan.rajotte-julien at efficios.com> wrote:
>
> utils_parse_time_suffix now support the following suffix:
>
>     "us" for microsecond,
>     "ms" for millisecond,
>     "s"  for second,
>     "m"  for minute,
>     "h"  for hour
>
> This remove the use of "m" for milliseconds and "u" for microseconds.
>
> Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
> ---
>  src/bin/lttng-sessiond/thread-utils.c     |  2 -
>  src/common/time.h                         |  8 ++++
>  src/common/utils.c                        | 48 +++++++++++++++++------
>  tests/unit/test_utils_parse_time_suffix.c | 30 +++++++++-----
>  4 files changed, 65 insertions(+), 23 deletions(-)
>
> diff --git a/src/bin/lttng-sessiond/thread-utils.c b/src/bin/lttng-sessiond/thread-utils.c
> index 549cd69f8..16ae9d692 100644
> --- a/src/bin/lttng-sessiond/thread-utils.c
> +++ b/src/bin/lttng-sessiond/thread-utils.c
> @@ -22,8 +22,6 @@
>  #include <common/utils.h>
>  #include <pthread.h>
>
> -#define USEC_PER_SEC 1000000
> -
>  /*
>   * Quit pipe for all threads. This permits a single cancellation point
>   * for all threads when receiving an event on the pipe.
> diff --git a/src/common/time.h b/src/common/time.h
> index 8a7dd958f..92775b9b2 100644
> --- a/src/common/time.h
> +++ b/src/common/time.h
> @@ -25,6 +25,14 @@
>  #define NSEC_PER_SEC   1000000000ULL
>  #define NSEC_PER_MSEC  1000000ULL
>  #define NSEC_PER_USEC  1000ULL
> +#define USEC_PER_SEC   1000000ULL
> +#define USEC_PER_MSEC  1000ULL
> +
> +#define SEC_PER_MINUTE 60ULL
> +#define MINUTE_PER_HOUR        60ULL
> +
> +#define USEC_PER_MINUTE        (USEC_PER_SEC * SEC_PER_MINUTE)
> +#define USEC_PER_HOURS (USEC_PER_MINUTE * MINUTE_PER_HOUR)
>
>  /*
>   * timespec_to_ms: Convert timespec to milliseconds.
> diff --git a/src/common/utils.c b/src/common/utils.c
> index 08139e5e2..2327b7d94 100644
> --- a/src/common/utils.c
> +++ b/src/common/utils.c
> @@ -1104,12 +1104,19 @@ end:
>
>  /**
>   * Parse a string that represents a time in human readable format. It
> - * supports decimal integers suffixed by 's', 'u', 'm', 'us', and 'ms'.
> + * supports decimal integers suffixed by:
> + *     "us" for microsecond,
> + *     "ms" for millisecond,
> + *     "s"  for second,
> + *     "m"  for minute,
> + *     "h"  for hour
>   *
>   * The suffix multiply the integer by:
> - * 'u'/'us': 1
> - * 'm'/'ms': 1000
> - * 's': 1000000
> + *     "us" : 1
> + *     "ms" : 1000
> + *     "s"  : 1000000
> + *     "m"  : 60000000
> + *     "h"  : 3600000000
>   *
>   * Note that unit-less numbers are assumed to be microseconds.
>   *
> @@ -1124,7 +1131,7 @@ int utils_parse_time_suffix(char const * const str, uint64_t * const time_us)
>  {
>         int ret;
>         uint64_t base_time;
> -       long multiplier = 1;
> +       uint64_t multiplier = 1;
>         const char *str_end;
>         char *num_end;
>
> @@ -1161,17 +1168,34 @@ int utils_parse_time_suffix(char const * const str, uint64_t * const time_us)
>         /* Check if a prefix is present. */
>         switch (*num_end) {
>         case 'u':
> -               multiplier = 1;
> -               /* Skip another letter in the 'us' case. */
> -               num_end += (*(num_end + 1) == 's') ? 2 : 1;
> +               /* Microsecond (us) */
> +               if (*(num_end + 1) != 's') {
> +                       DBG("utils_parse_time_suffix: invalid suffix.");
> +                       ret = -1;
> +                       goto end;
> +               }
> +               num_end += 2;
>                 break;
>         case 'm':
> -               multiplier = 1000;
> -               /* Skip another letter in the 'ms' case. */
> -               num_end += (*(num_end + 1) == 's') ? 2 : 1;
> +               if (*(num_end + 1) == 's') {
> +                       /* Millisecond (ms) */
> +                       multiplier = USEC_PER_MSEC;
> +                       /* Skip the 's' */
> +                       num_end++;
> +               } else {
> +                       /* Minute (m) */
> +                       multiplier = USEC_PER_MINUTE;
> +               }
> +               num_end++;
>                 break;
>         case 's':
> -               multiplier = 1000000;
> +               /* Second */
> +               multiplier = USEC_PER_SEC;
> +               num_end++;
> +               break;
> +       case 'h':
> +               /* Hour */
> +               multiplier = USEC_PER_HOURS;
>                 num_end++;
>                 break;
>         case '\0':
> diff --git a/tests/unit/test_utils_parse_time_suffix.c b/tests/unit/test_utils_parse_time_suffix.c
> index 96482769b..1e7aa22f1 100644
> --- a/tests/unit/test_utils_parse_time_suffix.c
> +++ b/tests/unit/test_utils_parse_time_suffix.c
> @@ -18,6 +18,7 @@
>  #include <assert.h>
>  #include <string.h>
>  #include <stdio.h>
> +#include <inttypes.h>
>
>  #include <tap/tap.h>
>
> @@ -37,16 +38,25 @@ struct valid_test_input {
>  static struct valid_test_input valid_tests_inputs[] = {
>                 { "0", 0 },
>                 { "1234", 1234 },
> -               { "0u", 0 },
> -               { "1234u", 1234 },
> -               { "16m", 16000 },
> -               { "128m", 128000 },
> +               { "1234us", 1234 },
> +               { "16ms", 16000 },
> +               { "128ms", 128000 },
>                 { "32s", 32000000 },
> +               { "1m", 60000000 },
> +               { "20m", 1200000000 },
> +               { "1h", 3600000000 },
> +               { "5h", 18000000000 },
>                 { "00", 0 },
> -               { "0m", 0 },
> +               { "0us", 0 },
> +               { "0ms", 0 },
>                 { "0s", 0 },
> -               { "00m", 0 },
> +               { "0m", 0 },
> +               { "0h", 0 },
> +               { "00us", 0 },
> +               { "00ms", 0 },
>                 { "00s", 0 },
> +               { "00m", 0 },
> +               { "00h", 0 },
>                 { "12ms", 12000 },
>                 { "3597us", 3597 },
>                 { "+5", 5 },
> @@ -79,6 +89,9 @@ static char *invalid_tests_inputs[] = {
>                 "14ns",
>                 "14ms garbage after value",
>                 "0x14s",
> +               "0u",
> +               "5mS",
> +               "5Ms",
>  };
>  static const int num_invalid_tests = sizeof(invalid_tests_inputs) / sizeof(invalid_tests_inputs[0]);
>
> @@ -90,11 +103,10 @@ static void test_utils_parse_time_suffix(void)
>
>         /* Test valid cases */
>         for (i = 0; i < num_valid_tests; i++) {
> -               char name[100];
> -
> -               sprintf(name, "valid test case: %s", valid_tests_inputs[i].input);
> +               char name[256];
>
>                 ret = utils_parse_time_suffix(valid_tests_inputs[i].input, &result);
> +               sprintf(name, "valid test case: %s expected %" PRIu64, valid_tests_inputs[i].input, result);
>                 ok(ret == 0 && result == valid_tests_inputs[i].expected_result, name);
>         }
>
> --
> 2.17.1
>


-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com


More information about the lttng-dev mailing list