summaryrefslogtreecommitdiff
path: root/src/tools/time_utils.h
diff options
context:
space:
mode:
authorDimitri Staessens <[email protected]>2018-06-13 13:18:10 +0200
committerSander Vrijders <[email protected]>2018-06-13 13:39:55 +0200
commit47c922f1360990f2da8363aafa0798551a2128ef (patch)
tree8009e3a2bc692ae279bdc140a931b4baae927a25 /src/tools/time_utils.h
parent39e0358161212c5d662208360c1fdcb68ee6b64a (diff)
downloadouroboros-47c922f1360990f2da8363aafa0798551a2128ef.tar.gz
ouroboros-47c922f1360990f2da8363aafa0798551a2128ef.zip
lib: Use macros for all time utility functions0.11.9
This replaces the time utility functions with macros. This avoids using library functions in the tools and also slightly speeds up the implementation. Signed-off-by: Dimitri Staessens <[email protected]> Signed-off-by: Sander Vrijders <[email protected]>
Diffstat (limited to 'src/tools/time_utils.h')
-rw-r--r--src/tools/time_utils.h75
1 files changed, 57 insertions, 18 deletions
diff --git a/src/tools/time_utils.h b/src/tools/time_utils.h
index c9760a8b..f4f561bd 100644
--- a/src/tools/time_utils.h
+++ b/src/tools/time_utils.h
@@ -35,7 +35,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
#ifndef OUROBOROS_TOOLS_TIME_UTILS_H
#define OUROBOROS_TOOLS_TIME_UTILS_H
@@ -52,7 +51,6 @@
#include <time.h>
#include <sys/time.h>
-#include <limits.h> /* LONG_MAX */
/* functions for timespecs */
#define ts_diff_ns(t0, tx) (((tx)->tv_sec - (t0)->tv_sec) * BILLION \
@@ -69,29 +67,70 @@
+ ((tx)->tv_usec - (t0)->tv_usec) / MILLION)
/* functions for timespecs */
-int ts_add(const struct timespec * t,
- const struct timespec * intv,
- struct timespec * res);
-int ts_diff(const struct timespec * t,
- const struct timespec * intv,
- struct timespec * res);
+#define ts_add(t, intv, res) \
+ do { \
+ time_t nanos = 0; \
+ nanos = (t)->tv_nsec + (intv)->tv_nsec; \
+ (res)->tv_sec = (t)->tv_sec + (intv)->tv_sec; \
+ while (nanos >= BILLION) { \
+ nanos -= BILLION; \
+ ++((res)->tv_sec); \
+ } \
+ (res)->tv_nsec = nanos; \
+ } while (0);
+
+#define ts_diff(t, intv, res) \
+ do { \
+ time_t nanos = 0; \
+ nanos = (t)->tv_nsec - (intv)->tv_nsec; \
+ (res)->tv_sec = (t)->tv_sec - (intv)->tv_sec; \
+ while (nanos < 0) { \
+ nanos += BILLION; \
+ --((res)->tv_sec); \
+ } \
+ (res)->tv_nsec = nanos; \
+ } while (0);
/* functions for timevals */
-int tv_add(const struct timeval * t,
- const struct timeval * intv,
- struct timeval * res);
-int tv_diff(const struct timeval * t,
- const struct timeval * intv,
- struct timeval * res);
+#define tv_add(t, intv, res) \
+ do { \
+ time_t micros = 0; \
+ nanos = (t)->tv_usec + (intv)->tv_usec; \
+ (res)->tv_sec = (t)->tv_sec + (intv)->tv_sec; \
+ while (micros >= MILLION) { \
+ micros -= MILLION; \
+ ++((res)->tv_sec); \
+ } \
+ (res)->tv_nsec = nanos; \
+ } while (0);
+
+#define tv_diff(t, intv, res) \
+ do { \
+ time_t micros = 0; \
+ micros = (t)->tv_usec - (intv)->tv_usec; \
+ (res)->tv_sec = (t)->tv_sec - (intv)->tv_sec; \
+ while (micros < 0) { \
+ micros += MILLION; \
+ --((res)->tv_sec); \
+ } \
+ (res)->tv_usec = micros; \
+ } while (0);
+
/* copying a timeval into a timespec */
-int tv_to_ts(const struct timeval * src,
- struct timespec * dst);
+#define tv_to_ts(tv, ts) \
+ do { \
+ (ts)->tv_sec = (tv)->tv_sec; \
+ (ts)->tv_nsec = (tv)->tv_usec * 1000L; \
+ } while (0);
/* copying a timespec into a timeval (loss of resolution) */
-int ts_to_tv(const struct timespec * src,
- struct timeval * dst);
+#define ts_to_tv(ts, tv) \
+ do { \
+ (tv)->tv_sec = (ts)->tv_sec; \
+ (tv)->tv_usec = (ts)->tv_nsec / 1000L; \
+ } while (0);
#endif /* OUROBOROS_TOOLS_TIME_UTILS_H */