From: Michael Lee Date: Sat, 24 Jun 2017 03:11:14 +0000 (-0700) Subject: Fix up and namespace clock_gettime and clock_getres for MacOS X-Git-Tag: v2017.06.26.00~3 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8a7112c6839b8087ad663212a8d13c0e961dee52;p=folly.git Fix up and namespace clock_gettime and clock_getres for MacOS Summary: Resolve two issues with folly's clock_gettime() shim on Apple platforms (iOS, macOS, etc.): When detecting whether folly should define clock_gettime() on Apple platforms, don't assume clock_gettime() is declared in Apple's headers just because MAC_OS_X_VERSION_10_12/__IPHONE_10_0 is defined. Someone might use a newer macOS or iOS SDK (which defines MAC_OS_X_VERSION_10_12/__IPHONE_10_0), but not have clock_gettime() (because _DARWIN_FEATURE_CLOCK_GETTIME isn't set). When defining a shim for clock_gettime(), don't rely on Apple's clock_gettime() declaration. Instead, shadow Apple's declaration with our own. This prevents folly from inheriting Apple's availability and visibility attributes for clock_gettime(). Reviewed By: yfeldblum Differential Revision: D5312574 fbshipit-source-id: f16634ce92ee6c299613d3db22f0537bd31ac14d --- diff --git a/folly/portability/Time.cpp b/folly/portability/Time.cpp index 54b3d0a1..e54286fe 100644 --- a/folly/portability/Time.cpp +++ b/folly/portability/Time.cpp @@ -43,6 +43,10 @@ static void duration_to_ts( #include #include +namespace folly { +namespace portability { +namespace time { + static std::chrono::nanoseconds time_value_to_ns(time_value_t t) { return std::chrono::seconds(t.seconds) + std::chrono::microseconds(t.microseconds); @@ -136,6 +140,10 @@ int clock_getres(clockid_t clk_id, struct timespec* ts) { return 0; } + +} // namespace time +} // namespace portability +} // namespace folly #elif defined(_WIN32) #include #include @@ -144,6 +152,10 @@ int clock_getres(clockid_t clk_id, struct timespec* ts) { #include +namespace folly { +namespace portability { +namespace time { + using unsigned_nanos = std::chrono::duration; static unsigned_nanos filetimeToUnsignedNanos(FILETIME ft) { @@ -272,6 +284,10 @@ extern "C" int clock_gettime(clockid_t clock_id, struct timespec* tp) { return -1; } } + +} // namespace time +} // namespace portability +} // namespace folly #else #error No clock_gettime(3) compatibility wrapper available for this platform. #endif diff --git a/folly/portability/Time.h b/folly/portability/Time.h index eb6c7941..a7e5cf2d 100644 --- a/folly/portability/Time.h +++ b/folly/portability/Time.h @@ -20,6 +20,7 @@ #include #include +#include // OSX is a pain. The XCode 8 SDK always declares clock_gettime // even if the target OS version doesn't support it, so you get @@ -27,15 +28,10 @@ // solve that by pretending we have it here in the header and // then enable our implementation on the source side so that // gets linked in instead. -#if __MACH__ && \ +#if __MACH__ && FOLLY_HAVE_CLOCK_GETTIME && \ (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 || \ __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0) -#ifdef FOLLY_HAVE_CLOCK_GETTIME -#undef FOLLY_HAVE_CLOCK_GETTIME -#endif - -#define FOLLY_HAVE_CLOCK_GETTIME 1 #define FOLLY_FORCE_CLOCK_GETTIME_DEFINITION 1 #endif @@ -47,10 +43,25 @@ #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 +#endif +#if (!FOLLY_HAVE_CLOCK_GETTIME || FOLLY_FORCE_CLOCK_GETTIME_DEFINITION) && (defined(__MACH__) || defined(_WIN32)) +namespace folly { +namespace portability { +namespace time { typedef uint8_t clockid_t; -extern "C" int clock_gettime(clockid_t clk_id, struct timespec* ts); -extern "C" int clock_getres(clockid_t clk_id, struct timespec* ts); +int clock_gettime(clockid_t clk_id, struct timespec* ts); +int clock_getres(clockid_t clk_id, struct timespec* ts); +} +} +} + +FOLLY_PUSH_WARNING +#if __CLANG_PREREQ(3, 0) +FOLLY_GCC_DISABLE_WARNING("-Wheader-hygiene") +#endif +/* using override */ using namespace folly::portability::time; +FOLLY_POP_WARNING #endif #ifdef _WIN32