mirror of https://github.com/google/benchmark.git
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:
parent
dce3322a54
commit
a9704c268d
|
@ -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>
|
||||||
|
|
16
src/sleep.cc
16
src/sleep.cc
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue