[Piglit] [PATCH 1/2] util: Add piglit_delay_ns() api

Robert Bragg robert at sixbynine.org
Tue Sep 6 13:00:33 UTC 2016


Provides a utility for blocking the cpu for a requested time (nanosleep
+ retry on SIGINT for Linux else usleep()) and reports the final
duration to help tests be resilient to over or under runs due to
signalling or scheduling.

Signed-off-by: Robert Bragg <robert at sixbynine.org>
---
 tests/util/piglit-util.c | 29 +++++++++++++++++++++++++----
 tests/util/piglit-util.h | 15 +++++++++++++++
 2 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/tests/util/piglit-util.c b/tests/util/piglit-util.c
index 0a66a85..b9c4606 100644
--- a/tests/util/piglit-util.c
+++ b/tests/util/piglit-util.c
@@ -32,6 +32,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/syscall.h>
+#include <time.h>
 #endif
 
 #include <assert.h>
@@ -42,13 +43,10 @@
 #include <errno.h>
 #include <inttypes.h>
 
-#ifdef PIGLIT_HAS_POSIX_CLOCK_MONOTONIC
-#ifdef PIGLIT_HAS_POSIX_TIMER_NOTIFY_THREAD
+#if defined(PIGLIT_HAS_POSIX_CLOCK_MONOTONIC) && defined(PIGLIT_HAS_POSIX_TIMER_NOTIFY_THREAD)
 #include <pthread.h>
 #include <signal.h>
 #endif
-#include <time.h>
-#endif
 
 #include "config.h"
 #if defined(HAVE_SYS_TIME_H) && defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_SETRLIMIT)
@@ -624,6 +622,29 @@ piglit_time_get_nano(void)
 #endif
 }
 
+int64_t
+piglit_delay_ns(int64_t time_ns)
+{
+	int64_t start = start = piglit_time_get_nano();
+	int64_t end;
+
+#ifdef __linux__
+	struct timespec ts;
+
+	ts.tv_sec = time_ns / 1000000000LL;
+	ts.tv_nsec = time_ns - ts.tv_sec * 1000000000LL;
+
+	while (nanosleep(&ts, &ts) == -1 && errno == EINTR)
+		;
+#else
+	usleep(time_ns / 1000);
+#endif
+
+	end = piglit_time_get_nano();
+
+	return end - start;
+}
+
 /**
  * Search for an argument with the given name in the argument list.
  * If it is found, remove it and return true.
diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
index 4328863..a36ffe2 100644
--- a/tests/util/piglit-util.h
+++ b/tests/util/piglit-util.h
@@ -406,6 +406,21 @@ piglit_time_is_monotonic();
 int64_t
 piglit_time_get_nano(void);
 
+/**
+ * \brief Try to delay for a given duration
+ *
+ * \param time_ns	The requested duration to wait for
+ *
+ * Returns the time elapsed which may be cut short or overrun the requested
+ * duration, e.g. due to signal handling or scheduling.
+ *
+ * \sa on Linux nanosleep is used and restarted on SIGINT
+ * \sa usleep() is use on other OSs
+ * \sa the returned duration is timed using piglit_time_get_nano()
+ */
+int64_t
+piglit_delay_ns(int64_t time_ns);
+
 const char**
 piglit_split_string_to_array(const char *string, const char *separators);
 
-- 
2.9.2



More information about the Piglit mailing list