summaryrefslogtreecommitdiffstats
path: root/Utilities/cmlibuv/src/unix/posix-hrtime.c
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-09-13 18:33:38 (GMT)
committerBrad King <brad.king@kitware.com>2017-09-17 15:10:18 (GMT)
commit714ce728828c267da9a5c0d9f2e48eb5f88a8336 (patch)
tree6b7857ad6dddef5f691ebb609c1d43e695e21d58 /Utilities/cmlibuv/src/unix/posix-hrtime.c
parent6a2d967de07a52f0460089999349e31741b402f8 (diff)
downloadCMake-714ce728828c267da9a5c0d9f2e48eb5f88a8336.zip
CMake-714ce728828c267da9a5c0d9f2e48eb5f88a8336.tar.gz
CMake-714ce728828c267da9a5c0d9f2e48eb5f88a8336.tar.bz2
bootstrap: Make libuv available during bootstrap
On UNIX, build only the parts of libuv we need for the filesystem, process, and poll abstractions using the POSIX poll() backend. This avoids many platform-specific conditions. On Windows, build all of libuv; there are no conditional alternatives anyway.
Diffstat (limited to 'Utilities/cmlibuv/src/unix/posix-hrtime.c')
-rw-r--r--Utilities/cmlibuv/src/unix/posix-hrtime.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/Utilities/cmlibuv/src/unix/posix-hrtime.c b/Utilities/cmlibuv/src/unix/posix-hrtime.c
index 323dfc2..a264250 100644
--- a/Utilities/cmlibuv/src/unix/posix-hrtime.c
+++ b/Utilities/cmlibuv/src/unix/posix-hrtime.c
@@ -22,6 +22,29 @@
#include "uv.h"
#include "internal.h"
+#if defined(__APPLE__)
+/* Special case for CMake bootstrap: no clock_gettime on macOS < 10.12 */
+
+#ifndef CMAKE_BOOTSTRAP
+#error "This code path meant only for use during CMake bootstrap."
+#endif
+
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+
+uint64_t uv__hrtime(uv_clocktype_t type) {
+ static mach_timebase_info_data_t info;
+
+ if ((ACCESS_ONCE(uint32_t, info.numer) == 0 ||
+ ACCESS_ONCE(uint32_t, info.denom) == 0) &&
+ mach_timebase_info(&info) != KERN_SUCCESS)
+ abort();
+
+ return mach_absolute_time() * info.numer / info.denom;
+}
+
+#else
+
#include <stdint.h>
#include <time.h>
@@ -33,3 +56,5 @@ uint64_t uv__hrtime(uv_clocktype_t type) {
clock_gettime(CLOCK_MONOTONIC, &ts);
return (((uint64_t) ts.tv_sec) * NANOSEC + ts.tv_nsec);
}
+
+#endif