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