Adapted from https://github.com/zcash/libsnark/pull/10 diff --git a/depends/libff/libff/common/profiling.cpp b/depends/libff/libff/common/profiling.cpp index f2a1985..319149c 100755 --- a/depends/libff/libff/common/profiling.cpp +++ b/depends/libff/libff/common/profiling.cpp @@ -27,6 +27,13 @@ #include #endif +#ifdef __MACH__ +#include +#include +#include +#include +#endif + namespace libff { long long get_nsec_time() @@ -42,10 +49,20 @@ long long get_nsec_cpu_time() return 0; #else ::timespec ts; +#ifdef __MACH__ + clock_serv_t cclock; + mach_timespec_t mts; + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + ts.tv_sec = mts.tv_sec; + ts.tv_nsec = mts.tv_nsec; +#else if ( ::clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) ) throw ::std::runtime_error("clock_gettime(CLOCK_PROCESS_CPUTIME_ID) failed"); // If we expected this to work, don't silently ignore failures, because that would hide the problem and incur an unnecessarily system-call overhead. So if we ever observe this exception, we should probably add a suitable #ifdef . //TODO: clock_gettime(CLOCK_PROCESS_CPUTIME_ID) is not supported by native Windows. What about Cygwin? Should we #ifdef on CLOCK_PROCESS_CPUTIME_ID or on __linux__? +#endif return ts.tv_sec * 1000000000ll + ts.tv_nsec; #endif }