summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2016-10-22 19:59:42 -0400
committerTavian Barnes <tavianator@tavianator.com>2016-10-24 10:01:18 -0400
commit087b29c53e13299e195942e48ae309817f4f1d93 (patch)
tree6776cff9657f3affe0b05a423339ea76cf7bcbfe /eval.c
parentdd3c2a552725362cc03d7f7f631a0c24618cf4d2 (diff)
downloadbfs-087b29c53e13299e195942e48ae309817f4f1d93.tar.xz
Check for POSIX timers before using them.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/eval.c b/eval.c
index d66c9f6..4778b5d 100644
--- a/eval.c
+++ b/eval.c
@@ -777,6 +777,27 @@ bool eval_xtype(const struct expr *expr, struct eval_state *state) {
return false;
}
+#if _POSIX_MONOTONIC_CLOCK > 0
+# define BFS_CLOCK CLOCK_MONOTONIC
+#elif _POSIX_TIMERS > 0
+# define BFS_CLOCK CLOCK_REALTIME
+#endif
+
+/**
+ * Call clock_gettime(), if available.
+ */
+static int eval_gettime(struct timespec *ts) {
+#ifdef BFS_CLOCK
+ int ret = clock_gettime(BFS_CLOCK, ts);
+ if (ret != 0) {
+ perror("clock_gettime()");
+ }
+ return ret;
+#else
+ return -1;
+#endif
+}
+
/**
* Record the time that elapsed evaluating an expression.
*/
@@ -799,8 +820,7 @@ static bool eval_expr(struct expr *expr, struct eval_state *state) {
struct timespec start, end;
bool time = state->cmdline->debug & DEBUG_RATES;
if (time) {
- if (clock_gettime(CLOCK_MONOTONIC, &start) != 0) {
- perror("clock_gettime()");
+ if (eval_gettime(&start) != 0) {
time = false;
}
}
@@ -808,10 +828,8 @@ static bool eval_expr(struct expr *expr, struct eval_state *state) {
bool ret = expr->eval(expr, state);
if (time) {
- if (clock_gettime(CLOCK_MONOTONIC, &end) == 0) {
+ if (eval_gettime(&end) == 0) {
add_elapsed(expr, &start, &end);
- } else {
- perror("clock_gettime()");
}
}