1// Copyright 2015 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15#include "sleep.h" 16 17#include <cerrno> 18#include <cstdlib> 19#include <ctime> 20 21#include "internal_macros.h" 22 23#ifdef BENCHMARK_OS_WINDOWS 24#include <Windows.h> 25#endif 26 27namespace benchmark { 28#ifdef BENCHMARK_OS_WINDOWS 29// Window's Sleep takes milliseconds argument. 30void SleepForMilliseconds(int milliseconds) { Sleep(milliseconds); } 31void SleepForSeconds(double seconds) { 32 SleepForMilliseconds(static_cast<int>(kNumMillisPerSecond * seconds)); 33} 34#else // BENCHMARK_OS_WINDOWS 35void SleepForMicroseconds(int microseconds) { 36 struct timespec sleep_time; 37 sleep_time.tv_sec = microseconds / kNumMicrosPerSecond; 38 sleep_time.tv_nsec = (microseconds % kNumMicrosPerSecond) * kNumNanosPerMicro; 39 while (nanosleep(&sleep_time, &sleep_time) != 0 && errno == EINTR) 40 ; // Ignore signals and wait for the full interval to elapse. 41} 42 43void SleepForMilliseconds(int milliseconds) { 44 SleepForMicroseconds(milliseconds * kNumMicrosPerMilli); 45} 46 47void SleepForSeconds(double seconds) { 48 SleepForMicroseconds(static_cast<int>(seconds * kNumMicrosPerSecond)); 49} 50#endif // BENCHMARK_OS_WINDOWS 51} // end namespace benchmark 52