diff options
author | Abhina Sree <69635948+abhina-sree@users.noreply.github.com> | 2020-10-29 04:49:02 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-29 08:49:02 +0000 |
commit | a9704c268dd2ed8bc65d8fc2880cb7a0ddd64d2c (patch) | |
tree | 470fcb71f1b5ddad8f17595203922873150c9a2a | |
parent | dce3322a549650d18f50b5f1428a5942327ab6a5 (diff) | |
download | google-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-- | CONTRIBUTORS | 1 | ||||
-rw-r--r-- | src/sleep.cc | 16 |
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) { |