From 411279afc10f58c9ee8a7e5599bd96c5ff32cd6c Mon Sep 17 00:00:00 2001 From: netblue30 Date: Tue, 1 Dec 2020 08:51:27 -0500 Subject: a more portable implementation for time measurements --- src/lib/common.c | 55 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 25 deletions(-) (limited to 'src/lib') diff --git a/src/lib/common.c b/src/lib/common.c index 872772ec7..823442835 100644 --- a/src/lib/common.c +++ b/src/lib/common.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "../include/common.h" #define BUFLEN 4096 @@ -290,38 +291,42 @@ int pid_hidepid(void) { //************************** // time trace based on getticks function //************************** -static int tt_not_implemented = 0; // not implemented for the current architecture -static unsigned long long tt_1ms = 0; -static unsigned long long tt = 0; // start time +typedef struct list_entry_t { + struct list_entry_t *next; + struct timespec ts; +} ListEntry; -void timetrace_start(void) { - if (tt_not_implemented) - return; - unsigned long long t1 = getticks(); - if (t1 == 0) { - tt_not_implemented = 1; - return; - } +static ListEntry *ts_list = NULL; - if (tt_1ms == 0) { - usleep(1000); // sleep 1 ms - unsigned long long t2 = getticks(); - tt_1ms = t2 - t1; - if (tt_1ms == 0) { - tt_not_implemented = 1; - return; - } - } +static inline float msdelta(struct timespec *start, struct timespec *end) { + unsigned sec = end->tv_sec - start->tv_sec; + long nsec = end->tv_nsec - start->tv_nsec; + return (float) sec * 1000 + (float) nsec / 1000000; +} - tt = getticks(); +void timetrace_start(void) { + ListEntry *t = malloc(sizeof(ListEntry)); + if (!t) + errExit("malloc"); + memset(t, 0, sizeof(ListEntry)); + clock_gettime(CLOCK_MONOTONIC, &t->ts); + + // add it to the list + t->next = ts_list; + ts_list = t; } float timetrace_end(void) { - if (tt_not_implemented) + if (!ts_list) return 0; - unsigned long long delta = getticks() - tt; - assert(tt_1ms); + // remove start time from the list + ListEntry *t = ts_list; + ts_list = t->next; - return (float) delta / (float) tt_1ms; + struct timespec end; + clock_gettime(CLOCK_MONOTONIC, &end); + float rv = msdelta(&t->ts, &end); + free(t); + return rv; } -- cgit v1.2.3-54-g00ecf