#include "HalideRuntime.h" #include "runtime_internal.h" #ifndef __clockid_t_defined #define __clockid_t_defined 1 typedef int32_t clockid_t; #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 #define CLOCK_MONOTONIC_RAW 4 #define CLOCK_REALTIME_COARSE 5 #define CLOCK_MONOTONIC_COARSE 6 #define CLOCK_BOOTTIME 7 #define CLOCK_REALTIME_ALARM 8 #define CLOCK_BOOTTIME_ALARM 9 #endif // __clockid_t_defined #ifndef _STRUCT_TIMESPEC #define _STRUCT_TIMESPEC struct timespec { long tv_sec; /* Seconds. */ long tv_nsec; /* Nanoseconds. */ }; #endif // _STRUCT_TIMESPEC extern "C" { WEAK bool halide_reference_clock_inited = false; WEAK timespec halide_reference_clock; // The syscall number for gettime varies across platforms: // -- android arm is 263 // -- i386 and android x86 is 265 // -- x64 is 228 #ifndef SYS_CLOCK_GETTIME #ifdef BITS_64 #define SYS_CLOCK_GETTIME 228 #endif #ifdef BITS_32 #define SYS_CLOCK_GETTIME 265 #endif #endif extern int syscall(int num, ...); WEAK int halide_start_clock(void *user_context) { // Guard against multiple calls if (!halide_reference_clock_inited) { syscall(SYS_CLOCK_GETTIME, CLOCK_REALTIME, &halide_reference_clock); halide_reference_clock_inited = true; } return 0; } WEAK int64_t halide_current_time_ns(void *user_context) { // It is an error to call halide_current_time_ns() if halide_start_clock() has never been called halide_debug_assert(user_context, halide_reference_clock_inited); timespec now; // To avoid requiring people to link -lrt, we just make the syscall directly. syscall(SYS_CLOCK_GETTIME, CLOCK_REALTIME, &now); int64_t d = int64_t(now.tv_sec - halide_reference_clock.tv_sec) * 1000000000; int64_t nd = (now.tv_nsec - halide_reference_clock.tv_nsec); return d + nd; } extern int usleep(int); WEAK void halide_sleep_ms(void *user_context, int ms) { usleep(ms * 1000); } }