summaryrefslogtreecommitdiff
path: root/lib/timeval.c
diff options
context:
space:
mode:
authorPaul Ingram <pingram@nicira.com>2013-09-12 18:19:04 -0700
committerBen Pfaff <blp@nicira.com>2013-09-13 09:11:46 -0700
commit2b31d8e713de705fdca1c412d4748077f85e4009 (patch)
tree7f0babf08dd16c1fbb411a1c16bf6e055aa88294 /lib/timeval.c
parent63a04c1b5fdbf5a0acfe7e39f27445dd5008c45f (diff)
downloadopenvswitch-2b31d8e713de705fdca1c412d4748077f85e4009.tar.gz
vlog: Report timestamps in millisecond resolution in log messages.
To make debugging easier. Signed-off-by: Ben Pfaff <blp@nicira.com> Signed-off-by: Paul Ingram <pingram@nicira.com>
Diffstat (limited to 'lib/timeval.c')
-rw-r--r--lib/timeval.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/timeval.c b/lib/timeval.c
index 326239744..c24788ab3 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -494,3 +494,49 @@ timeval_dummy_register(void)
unixctl_command_register("time/warp", "MSECS", 1, 1,
timeval_warp_cb, NULL);
}
+
+
+
+/* strftime() with an extension for high-resolution timestamps. Any '#'s in
+ * 'format' will be replaced by subseconds, e.g. use "%S.###" to obtain results
+ * like "01.123". */
+size_t
+strftime_msec(char *s, size_t max, const char *format,
+ const struct tm_msec *tm)
+{
+ size_t n;
+
+ n = strftime(s, max, format, &tm->tm);
+ if (n) {
+ char decimals[4];
+ char *p;
+
+ sprintf(decimals, "%03d", tm->msec);
+ for (p = strchr(s, '#'); p; p = strchr(p, '#')) {
+ char *d = decimals;
+ while (*p == '#') {
+ *p++ = *d ? *d++ : '0';
+ }
+ }
+ }
+
+ return n;
+}
+
+struct tm_msec *
+localtime_msec(long long int now, struct tm_msec *result)
+{
+ time_t now_sec = now / 1000;
+ localtime_r(&now_sec, &result->tm);
+ result->msec = now % 1000;
+ return result;
+}
+
+struct tm_msec *
+gmtime_msec(long long int now, struct tm_msec *result)
+{
+ time_t now_sec = now / 1000;
+ gmtime_r(&now_sec, &result->tm);
+ result->msec = now % 1000;
+ return result;
+}