diff --git a/src/conf/janetconf.h b/src/conf/janetconf.h index f31a8b35..eae3caa7 100644 --- a/src/conf/janetconf.h +++ b/src/conf/janetconf.h @@ -41,7 +41,8 @@ /* #define JANET_API __attribute__((visibility ("default"))) */ /* These settings should be specified before amalgamation is - * built. */ + * built. Any build with these set should be considered non-standard, and + * certain Janet libraries should be expected not to work. */ /* #define JANET_NO_DOCSTRINGS */ /* #define JANET_NO_SOURCEMAPS */ /* #define JANET_REDUCED_OS */ @@ -51,13 +52,13 @@ /* #define JANET_NO_NET */ /* #define JANET_NO_TYPED_ARRAY */ /* #define JANET_NO_INT_TYPES */ +/* #define JANET_NO_REALPATH */ +/* #define JANET_NO_SYMLINKS */ +/* #define JANET_NO_UMASK */ /* Other settings */ /* #define JANET_NO_PRF */ /* #define JANET_NO_UTC_MKTIME */ -/* #define JANET_NO_REALPATH */ -/* #define JANET_NO_SYMLINKS */ -/* #define JANET_NO_UMASK */ /* #define JANET_OUT_OF_MEMORY do { printf("janet out of memory\n"); exit(1); } while (0) */ /* #define JANET_EXIT(msg) do { printf("C assert failed executing janet: %s\n", msg); exit(1); } while (0) */ /* #define JANET_TOP_LEVEL_SIGNAL(msg) call_my_function((msg), stderr) */ diff --git a/src/core/os.c b/src/core/os.c index 201d2930..1b794890 100644 --- a/src/core/os.c +++ b/src/core/os.c @@ -514,39 +514,11 @@ static Janet os_time(int32_t argc, Janet *argv) { return janet_wrap_number(dtime); } -/* Clock shims */ -#ifdef JANET_WINDOWS -static int gettime(struct timespec *spec) { - FILETIME ftime; - GetSystemTimeAsFileTime(&ftime); - int64_t wintime = (int64_t)(ftime.dwLowDateTime) | ((int64_t)(ftime.dwHighDateTime) << 32); - /* Windows epoch is January 1, 1601 apparently */ - wintime -= 116444736000000000LL; - spec->tv_sec = wintime / 10000000LL; - /* Resolution is 100 nanoseconds. */ - spec->tv_nsec = wintime % 10000000LL * 100; - return 0; -} -#elif defined(__MACH__) -static int gettime(struct timespec *spec) { - 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); - spec->tv_sec = mts.tv_sec; - spec->tv_nsec = mts.tv_nsec; - return 0; -} -#else -#define gettime(TV) clock_gettime(CLOCK_MONOTONIC, (TV)) -#endif - static Janet os_clock(int32_t argc, Janet *argv) { janet_fixarity(argc, 0); (void) argv; struct timespec tv; - if (gettime(&tv)) janet_panic("could not get time"); + if (janet_gettime(&tv)) janet_panic("could not get time"); double dtime = tv.tv_sec + (tv.tv_nsec / 1E9); return janet_wrap_number(dtime); } diff --git a/src/core/thread.c b/src/core/thread.c index 54905135..d1d6cbab 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -234,7 +234,7 @@ static void janet_waiter_init(JanetWaiter *waiter, double sec) { if (waiter->timedwait) { /* N seconds -> timespec of (now + sec) */ struct timespec now; - clock_gettime(CLOCK_REALTIME, &now); + janet_gettime(&now); time_t tvsec = (time_t) floor(sec); long tvnsec = (long) floor(1000000000.0 * (sec - ((double) tvsec))); tvsec += now.tv_sec; diff --git a/src/core/util.c b/src/core/util.c index cb8f5bb1..7277f95b 100644 --- a/src/core/util.c +++ b/src/core/util.c @@ -590,3 +590,35 @@ JanetTable *janet_get_core_table(const char *name) { if (!janet_checktype(out, JANET_TABLE)) return NULL; return janet_unwrap_table(out); } + +/* Clock shims for various platforms */ +#ifdef JANET_GETTIME +#ifdef JANET_WINDOWS +int janet_gettime(struct timespec *spec) { + FILETIME ftime; + GetSystemTimeAsFileTime(&ftime); + int64_t wintime = (int64_t)(ftime.dwLowDateTime) | ((int64_t)(ftime.dwHighDateTime) << 32); + /* Windows epoch is January 1, 1601 apparently */ + wintime -= 116444736000000000LL; + spec->tv_sec = wintime / 10000000LL; + /* Resolution is 100 nanoseconds. */ + spec->tv_nsec = wintime % 10000000LL * 100; + return 0; +} +#elif defined(__MACH__) +int janet_gettime(struct timespec *spec) { + 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); + spec->tv_sec = mts.tv_sec; + spec->tv_nsec = mts.tv_nsec; + return 0; +} +#else +int janet_gettime(struct timespec *spec) { + return clock_gettime(CLOCK_MONOTONIC, spec); +} +#endif +#endif diff --git a/src/core/util.h b/src/core/util.h index c487622e..dd239a4b 100644 --- a/src/core/util.h +++ b/src/core/util.h @@ -97,6 +97,13 @@ void janet_core_def(JanetTable *env, const char *name, Janet x, const void *p); void janet_core_cfuns(JanetTable *env, const char *regprefix, const JanetReg *cfuns); #endif +/* Clock gettime */ +#if !defined(JANET_REDUCED_OS) || !defined(JANET_SINGLE_THREADED) +#include +#define JANET_GETTIME +int janet_gettime(struct timespec *spec); +#endif + /* Initialize builtin libraries */ void janet_lib_io(JanetTable *env); void janet_lib_math(JanetTable *env);