#include #include #if !defined(_MSC_VER) #if __has_include() #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(_linux_) #include #include #include #else #include #include #include #endif #if defined(_darwin_) #include #include #include // Y_IGNORE #include // Y_IGNORE #endif #if defined(_linux_) #include #include #endif namespace { static inline void* ErrnoLocation() { return &errno; } static int ClockGetres(clockid_t clk_id, struct timespec* res) { #if defined(_darwin_) static auto func = (decltype(&ClockGetres))dlsym(RTLD_SELF, "_clock_getres"); if (func) { return func(clk_id, res); } // https://opensource.apple.com/source/Libc/Libc-1158.1.2/gen/clock_gettime.c.auto.html switch (clk_id){ case CLOCK_REALTIME: case CLOCK_MONOTONIC: case CLOCK_PROCESS_CPUTIME_ID: res->tv_nsec = NSEC_PER_USEC; res->tv_sec = 0; return 0; case CLOCK_MONOTONIC_RAW: case CLOCK_MONOTONIC_RAW_APPROX: case CLOCK_UPTIME_RAW: case CLOCK_UPTIME_RAW_APPROX: case CLOCK_THREAD_CPUTIME_ID: { mach_timebase_info_data_t tb_info; if (mach_timebase_info(&tb_info)) { return -1; } res->tv_nsec = tb_info.numer / tb_info.denom + (tb_info.numer % tb_info.denom != 0); res->tv_sec = 0; return 0; } default: errno = EINVAL; return -1; } #else return clock_getres(clk_id, res); #endif } } BEGIN_SYMS("c") SYM(calloc) SYM(clock_gettime) SYM_2("clock_getres", ClockGetres) SYM(closedir) SYM(fdopen) SYM(fflush) SYM(freeifaddrs) SYM(ftok) SYM(getifaddrs) SYM(getnameinfo) SYM(getpwnam) SYM(inet_ntop) SYM(opendir) SYM(printf) SYM(pthread_kill) SYM(pthread_self) SYM(readdir_r) SYM(sem_close) SYM(sem_getvalue) SYM(sem_open) SYM(sem_post) SYM(sem_trywait) SYM(sem_unlink) SYM(sem_wait) SYM(siginterrupt) SYM(strdup) SYM(sendfile) SYM(strtod) SYM_2("__errno_location", ErrnoLocation) #if defined(_linux_) SYM(prctl) SYM(ptrace) SYM(sched_getaffinity) SYM(sched_setaffinity) SYM(sem_timedwait) SYM(inotify_init) SYM(inotify_add_watch) SYM(inotify_rm_watch) SYM(mlockall) #endif #if defined(_darwin_) SYM(mach_absolute_time) SYM(mach_timebase_info) SYM(sysctlbyname) #endif #if __has_include() SYM(aio_error) SYM(aio_read) SYM(aio_return) SYM(aio_suspend) #endif END_SYMS() #endif