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