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
This commit is contained in:
Abhina Sree 2020-10-29 04:49:02 -04:00 committed by GitHub
parent dce3322a54
commit a9704c268d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 0 deletions

View File

@ -22,6 +22,7 @@
# #
# Please keep the list sorted. # Please keep the list sorted.
Abhina Sreeskantharajan <abhina.sreeskantharajan@ibm.com>
Albert Pretorius <pretoalb@gmail.com> Albert Pretorius <pretoalb@gmail.com>
Alex Steele <steelal123@gmail.com> Alex Steele <steelal123@gmail.com>
Andriy Berestovskyy <berestovskyy@gmail.com> Andriy Berestovskyy <berestovskyy@gmail.com>

View File

@ -24,6 +24,10 @@
#include <windows.h> #include <windows.h>
#endif #endif
#ifdef BENCHMARK_OS_ZOS
#include <unistd.h>
#endif
namespace benchmark { namespace benchmark {
#ifdef BENCHMARK_OS_WINDOWS #ifdef BENCHMARK_OS_WINDOWS
// Window's Sleep takes milliseconds argument. // Window's Sleep takes milliseconds argument.
@ -33,11 +37,23 @@ void SleepForSeconds(double seconds) {
} }
#else // BENCHMARK_OS_WINDOWS #else // BENCHMARK_OS_WINDOWS
void SleepForMicroseconds(int microseconds) { 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; struct timespec sleep_time;
sleep_time.tv_sec = microseconds / kNumMicrosPerSecond; sleep_time.tv_sec = microseconds / kNumMicrosPerSecond;
sleep_time.tv_nsec = (microseconds % kNumMicrosPerSecond) * kNumNanosPerMicro; sleep_time.tv_nsec = (microseconds % kNumMicrosPerSecond) * kNumNanosPerMicro;
while (nanosleep(&sleep_time, &sleep_time) != 0 && errno == EINTR) while (nanosleep(&sleep_time, &sleep_time) != 0 && errno == EINTR)
; // Ignore signals and wait for the full interval to elapse. ; // Ignore signals and wait for the full interval to elapse.
#endif
} }
void SleepForMilliseconds(int milliseconds) { void SleepForMilliseconds(int milliseconds) {