From a9704c268dd2ed8bc65d8fc2880cb7a0ddd64d2c Mon Sep 17 00:00:00 2001 From: Abhina Sree <69635948+abhina-sree@users.noreply.github.com> Date: Thu, 29 Oct 2020 04:49:02 -0400 Subject: [PATCH] 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 --- CONTRIBUTORS | 1 + src/sleep.cc | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d2f64356..802ce0dc 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -22,6 +22,7 @@ # # Please keep the list sorted. +Abhina Sreeskantharajan Albert Pretorius Alex Steele Andriy Berestovskyy diff --git a/src/sleep.cc b/src/sleep.cc index 1512ac90..4609d540 100644 --- a/src/sleep.cc +++ b/src/sleep.cc @@ -24,6 +24,10 @@ #include #endif +#ifdef BENCHMARK_OS_ZOS +#include +#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) {