Loading libutils/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -246,6 +246,7 @@ cc_test { "String8_test.cpp", "String8_test.cpp", "String16_test.cpp", "String16_test.cpp", "StrongPointer_test.cpp", "StrongPointer_test.cpp", "Timers_test.cpp", "Unicode_test.cpp", "Unicode_test.cpp", "Vector_test.cpp", "Vector_test.cpp", ], ], Loading libutils/Timers.cpp +23 −17 Original line number Original line Diff line number Diff line Loading @@ -20,31 +20,37 @@ #include <utils/Timers.h> #include <utils/Timers.h> #include <limits.h> #include <limits.h> #include <stdlib.h> #include <time.h> #include <time.h> // host linux support requires Linux 2.6.39+ #include <android-base/macros.h> static constexpr size_t clock_id_max = 5; static void checkClockId(int clock) { if (clock < 0 || clock >= clock_id_max) abort(); } #if defined(__linux__) #if defined(__linux__) nsecs_t systemTime(int clock) nsecs_t systemTime(int clock) { { checkClockId(clock); static const clockid_t clocks[] = { static constexpr clockid_t clocks[] = {CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, CLOCK_MONOTONIC, CLOCK_BOOTTIME}; CLOCK_PROCESS_CPUTIME_ID, static_assert(clock_id_max == arraysize(clocks)); CLOCK_THREAD_CPUTIME_ID, timespec t = {}; CLOCK_BOOTTIME }; struct timespec t; t.tv_sec = t.tv_nsec = 0; clock_gettime(clocks[clock], &t); clock_gettime(clocks[clock], &t); return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; } } #else #else nsecs_t systemTime(int /*clock*/) nsecs_t systemTime(int clock) { { // TODO: is this ever called with anything but REALTIME on mac/windows? checkClockId(clock); // Clock support varies widely across hosts. Mac OS doesn't support // Clock support varies widely across hosts. Mac OS doesn't support // CLOCK_BOOTTIME, and Windows is windows. // CLOCK_BOOTTIME (and doesn't even have clock_gettime until 10.12). struct timeval t; // Windows is windows. t.tv_sec = t.tv_usec = 0; timeval t = {}; gettimeofday(&t, nullptr); gettimeofday(&t, nullptr); return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL; return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL; } } Loading libutils/Timers_test.cpp 0 → 100644 +29 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <utils/Timers.h> #include <gtest/gtest.h> TEST(Timers, systemTime_invalid) { EXPECT_EXIT(systemTime(-1), testing::KilledBySignal(SIGABRT), ""); systemTime(SYSTEM_TIME_REALTIME); systemTime(SYSTEM_TIME_MONOTONIC); systemTime(SYSTEM_TIME_PROCESS); systemTime(SYSTEM_TIME_THREAD); systemTime(SYSTEM_TIME_BOOTTIME); EXPECT_EXIT(systemTime(SYSTEM_TIME_BOOTTIME + 1), testing::KilledBySignal(SIGABRT), ""); } libutils/include/utils/Timers.h +6 −12 Original line number Original line Diff line number Diff line Loading @@ -14,11 +14,7 @@ * limitations under the License. * limitations under the License. */ */ // #pragma once // Timer functions. // #ifndef _LIBS_UTILS_TIMERS_H #define _LIBS_UTILS_TIMERS_H #include <stdint.h> #include <stdint.h> #include <sys/types.h> #include <sys/types.h> Loading Loading @@ -81,7 +77,7 @@ enum { SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point SYSTEM_TIME_PROCESS = 2, // high-resolution per-process clock SYSTEM_TIME_PROCESS = 2, // high-resolution per-process clock SYSTEM_TIME_THREAD = 3, // high-resolution per-thread clock SYSTEM_TIME_THREAD = 3, // high-resolution per-thread clock SYSTEM_TIME_BOOTTIME = 4 // same as SYSTEM_TIME_MONOTONIC, but including CPU suspend time SYSTEM_TIME_BOOTTIME = 4, // same as SYSTEM_TIME_MONOTONIC, but including CPU suspend time }; }; // return the system-time according to the specified clock // return the system-time according to the specified clock Loading @@ -104,5 +100,3 @@ int toMillisecondTimeoutDelay(nsecs_t referenceTime, nsecs_t timeoutTime); #ifdef __cplusplus #ifdef __cplusplus } // extern "C" } // extern "C" #endif #endif #endif // _LIBS_UTILS_TIMERS_H Loading
libutils/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -246,6 +246,7 @@ cc_test { "String8_test.cpp", "String8_test.cpp", "String16_test.cpp", "String16_test.cpp", "StrongPointer_test.cpp", "StrongPointer_test.cpp", "Timers_test.cpp", "Unicode_test.cpp", "Unicode_test.cpp", "Vector_test.cpp", "Vector_test.cpp", ], ], Loading
libutils/Timers.cpp +23 −17 Original line number Original line Diff line number Diff line Loading @@ -20,31 +20,37 @@ #include <utils/Timers.h> #include <utils/Timers.h> #include <limits.h> #include <limits.h> #include <stdlib.h> #include <time.h> #include <time.h> // host linux support requires Linux 2.6.39+ #include <android-base/macros.h> static constexpr size_t clock_id_max = 5; static void checkClockId(int clock) { if (clock < 0 || clock >= clock_id_max) abort(); } #if defined(__linux__) #if defined(__linux__) nsecs_t systemTime(int clock) nsecs_t systemTime(int clock) { { checkClockId(clock); static const clockid_t clocks[] = { static constexpr clockid_t clocks[] = {CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, CLOCK_MONOTONIC, CLOCK_BOOTTIME}; CLOCK_PROCESS_CPUTIME_ID, static_assert(clock_id_max == arraysize(clocks)); CLOCK_THREAD_CPUTIME_ID, timespec t = {}; CLOCK_BOOTTIME }; struct timespec t; t.tv_sec = t.tv_nsec = 0; clock_gettime(clocks[clock], &t); clock_gettime(clocks[clock], &t); return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; } } #else #else nsecs_t systemTime(int /*clock*/) nsecs_t systemTime(int clock) { { // TODO: is this ever called with anything but REALTIME on mac/windows? checkClockId(clock); // Clock support varies widely across hosts. Mac OS doesn't support // Clock support varies widely across hosts. Mac OS doesn't support // CLOCK_BOOTTIME, and Windows is windows. // CLOCK_BOOTTIME (and doesn't even have clock_gettime until 10.12). struct timeval t; // Windows is windows. t.tv_sec = t.tv_usec = 0; timeval t = {}; gettimeofday(&t, nullptr); gettimeofday(&t, nullptr); return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL; return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL; } } Loading
libutils/Timers_test.cpp 0 → 100644 +29 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <utils/Timers.h> #include <gtest/gtest.h> TEST(Timers, systemTime_invalid) { EXPECT_EXIT(systemTime(-1), testing::KilledBySignal(SIGABRT), ""); systemTime(SYSTEM_TIME_REALTIME); systemTime(SYSTEM_TIME_MONOTONIC); systemTime(SYSTEM_TIME_PROCESS); systemTime(SYSTEM_TIME_THREAD); systemTime(SYSTEM_TIME_BOOTTIME); EXPECT_EXIT(systemTime(SYSTEM_TIME_BOOTTIME + 1), testing::KilledBySignal(SIGABRT), ""); }
libutils/include/utils/Timers.h +6 −12 Original line number Original line Diff line number Diff line Loading @@ -14,11 +14,7 @@ * limitations under the License. * limitations under the License. */ */ // #pragma once // Timer functions. // #ifndef _LIBS_UTILS_TIMERS_H #define _LIBS_UTILS_TIMERS_H #include <stdint.h> #include <stdint.h> #include <sys/types.h> #include <sys/types.h> Loading Loading @@ -81,7 +77,7 @@ enum { SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point SYSTEM_TIME_PROCESS = 2, // high-resolution per-process clock SYSTEM_TIME_PROCESS = 2, // high-resolution per-process clock SYSTEM_TIME_THREAD = 3, // high-resolution per-thread clock SYSTEM_TIME_THREAD = 3, // high-resolution per-thread clock SYSTEM_TIME_BOOTTIME = 4 // same as SYSTEM_TIME_MONOTONIC, but including CPU suspend time SYSTEM_TIME_BOOTTIME = 4, // same as SYSTEM_TIME_MONOTONIC, but including CPU suspend time }; }; // return the system-time according to the specified clock // return the system-time according to the specified clock Loading @@ -104,5 +100,3 @@ int toMillisecondTimeoutDelay(nsecs_t referenceTime, nsecs_t timeoutTime); #ifdef __cplusplus #ifdef __cplusplus } // extern "C" } // extern "C" #endif #endif #endif // _LIBS_UTILS_TIMERS_H