Support minute and hour as time suffixes
authorJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Fri, 14 Dec 2018 21:32:12 +0000 (16:32 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 11 Feb 2019 19:54:41 +0000 (14:54 -0500)
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 removes the use of "m" for milliseconds and "u" for microseconds.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/thread-utils.c
src/common/time.h
src/common/utils.c
tests/unit/test_utils_parse_time_suffix.c

index 549cd69f867e23998220f01e5e80174520b83014..16ae9d69204a971b07ac6d2857a148df87d983bd 100644 (file)
@@ -22,8 +22,6 @@
 #include <common/utils.h>
 #include <pthread.h>
 
 #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.
 /*
  * Quit pipe for all threads. This permits a single cancellation point
  * for all threads when receiving an event on the pipe.
index 894ab9259a135a3f7816d74e3475d268ec328b13..bb0991de68f19f8667c3e2f10f8cac60cf78b474 100644 (file)
 #include <time.h>
 #include <stdbool.h>
 
 #include <time.h>
 #include <stdbool.h>
 
-#define MSEC_PER_SEC   1000ULL
-#define NSEC_PER_SEC   1000000000ULL
-#define NSEC_PER_MSEC  1000000ULL
-#define NSEC_PER_USEC  1000ULL
+#define MSEC_PER_SEC    1000ULL
+#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)
 
 bool locale_supports_utf8(void);
 
 
 bool locale_supports_utf8(void);
 
index 3dc2d9297d4379ee99a6e127b17a84748dbf15de..a092d940f422979b724fa5a61a72365c54b83ad7 100644 (file)
@@ -1104,12 +1104,19 @@ end:
 
 /**
  * Parse a string that represents a time in human readable format. It
 
 /**
  * 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:
  *
  * 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.
  *
  *
  * 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;
 {
        int ret;
        uint64_t base_time;
-       long multiplier = 1;
+       uint64_t multiplier = 1;
        const char *str_end;
        char *num_end;
 
        const char *str_end;
        char *num_end;
 
@@ -1161,17 +1168,37 @@ 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':
        /* 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)
+                *
+                * Skip the "us" if the string matches the "us" suffix,
+                * otherwise let the check for the end of the string handle
+                * the error reporting.
+                */
+               if (*(num_end + 1) == 's') {
+                       num_end += 2;
+               }
                break;
        case 'm':
                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':
                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':
                num_end++;
                break;
        case '\0':
index 96482769bb9b87008a7de50cca73a9d3ac6acb7b..e7e782d266232a97e3ce6344f84d97a4d7c8ebaa 100644 (file)
@@ -18,6 +18,7 @@
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
+#include <inttypes.h>
 
 #include <tap/tap.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 },
 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 },
                { "32s", 32000000 },
+               { "1m", 60000000 },
+               { "20m", 1200000000 },
+               { "1h", 3600000000 },
+               { "5h", 18000000000 },
                { "00", 0 },
                { "00", 0 },
-               { "0m", 0 },
+               { "0us", 0 },
+               { "0ms", 0 },
                { "0s", 0 },
                { "0s", 0 },
-               { "00m", 0 },
+               { "0m", 0 },
+               { "0h", 0 },
+               { "00us", 0 },
+               { "00ms", 0 },
                { "00s", 0 },
                { "00s", 0 },
+               { "00m", 0 },
+               { "00h", 0 },
                { "12ms", 12000 },
                { "3597us", 3597 },
                { "+5", 5 },
                { "12ms", 12000 },
                { "3597us", 3597 },
                { "+5", 5 },
@@ -79,6 +89,14 @@ static char *invalid_tests_inputs[] = {
                "14ns",
                "14ms garbage after value",
                "0x14s",
                "14ns",
                "14ms garbage after value",
                "0x14s",
+               "0u",
+               "5mS",
+               "5Ms",
+               "12ussr",
+               "67msrp",
+               "14si",
+               "12mo",
+               "53hi",
 };
 static const int num_invalid_tests = sizeof(invalid_tests_inputs) / sizeof(invalid_tests_inputs[0]);
 
 };
 static const int num_invalid_tests = sizeof(invalid_tests_inputs) / sizeof(invalid_tests_inputs[0]);
 
@@ -90,11 +108,10 @@ static void test_utils_parse_time_suffix(void)
 
        /* Test valid cases */
        for (i = 0; i < num_valid_tests; i++) {
 
        /* 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);
 
                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);
        }
 
                ok(ret == 0 && result == valid_tests_inputs[i].expected_result, name);
        }
 
This page took 0.041735 seconds and 5 git commands to generate.