aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhina Sree <69635948+abhina-sree@users.noreply.github.com>2020-10-29 04:49:02 -0400
committerGitHub <noreply@github.com>2020-10-29 08:49:02 +0000
commita9704c268dd2ed8bc65d8fc2880cb7a0ddd64d2c (patch)
tree470fcb71f1b5ddad8f17595203922873150c9a2a
parentdce3322a549650d18f50b5f1428a5942327ab6a5 (diff)
downloadgoogle-benchmark-a9704c268dd2ed8bc65d8fc2880cb7a0ddd64d2c.tar.gz
Nanosleep workaround for z/OS in sleep.cc (#1067)
* z/OS does not support nanosleep, add workaround to use sleep() and usleep() instead * change unsigned to int, and fix while loop
-rw-r--r--CONTRIBUTORS1
-rw-r--r--src/sleep.cc16
2 files changed, 17 insertions, 0 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index d2f6435..802ce0d 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -22,6 +22,7 @@
#
# Please keep the list sorted.
+Abhina Sreeskantharajan <abhina.sreeskantharajan@ibm.com>
Albert Pretorius <pretoalb@gmail.com>
Alex Steele <steelal123@gmail.com>
Andriy Berestovskyy <berestovskyy@gmail.com>
diff --git a/src/sleep.cc b/src/sleep.cc
index 1512ac9..4609d54 100644
--- a/src/sleep.cc
+++ b/src/sleep.cc
@@ -24,6 +24,10 @@
#include <windows.h>
#endif
+#ifdef BENCHMARK_OS_ZOS
+#include <unistd.h>
+#endif
+
namespace benchmark {
#ifdef BENCHMARK_OS_WINDOWS
// Window's Sleep takes milliseconds argument.
@@ -33,11 +37,23 @@ void SleepForSeconds(double seconds) {
}
#else // BENCHMARK_OS_WINDOWS
void SleepForMicroseconds(int microseconds) {
+#ifdef BENCHMARK_OS_ZOS
+ // z/OS does not support nanosleep. Instead call sleep() and then usleep() to
+ // sleep for the remaining microseconds because usleep() will fail if its
+ // argument is greater than 1000000.
+ div_t sleepTime = div(microseconds, kNumMicrosPerSecond);
+ int seconds = sleepTime.quot;
+ while (seconds != 0)
+ seconds = sleep(seconds);
+ while (usleep(sleepTime.rem) == -1 && errno == EINTR)
+ ;
+#else
struct timespec sleep_time;
sleep_time.tv_sec = microseconds / kNumMicrosPerSecond;
sleep_time.tv_nsec = (microseconds % kNumMicrosPerSecond) * kNumNanosPerMicro;
while (nanosleep(&sleep_time, &sleep_time) != 0 && errno == EINTR)
; // Ignore signals and wait for the full interval to elapse.
+#endif
}
void SleepForMilliseconds(int milliseconds) {