diff options
author | okuoku <mjt@cltn.org> | 2022-08-28 00:33:42 +0900 |
---|---|---|
committer | Mike Montague <mikemon@gmail.com> | 2022-08-28 08:33:01 -0700 |
commit | 1e0ca4d994b2a97a73b605479f8ce2175cfe295e (patch) | |
tree | c772b031b32559953e9046c67b56337f0ecdaa1a | |
parent | c749f3144ef9e8a9a97fffbc16f1f48b25368a79 (diff) |
threads: osx: Port thread-sleep! to osx
macOS lacks POSIX clock_nanosleep implementation. Workaround with
nanosleep. As just like current Windows implementation, it does not
handle local time updates.
clock_gettime requires macOS 10.12(Sierra) or later.
-rw-r--r-- | src/syncthrd.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/syncthrd.cpp b/src/syncthrd.cpp index 09c88f4..1f23430 100644 --- a/src/syncthrd.cpp +++ b/src/syncthrd.cpp @@ -487,7 +487,25 @@ Define("thread-sleep!", ThreadSleepPrimitive)(long_t argc, FObject argv[]) #ifdef FOMENT_UNIX EnterWait(); +#ifdef FOMENT_OSX + struct timespec ts; + uint64_t wake; + ts = AsTime(argv[0])->timespec; + wake = ts.tv_sec * 1000000000UL + ts.tv_nsec; + for (;;) + { + uint64_t now, diff; + // Requires macOS 10.12 or later + now = clock_gettime_nsec_np(CLOCK_REALTIME); + if(now >= wake) break; + diff = wake - now; + ts.tv_sec = diff / 1000000000UL; + ts.tv_nsec = diff % 1000000000UL; + nanosleep(&ts, 0); + } +#else clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &(AsTime(argv[0])->timespec), 0); +#endif LeaveWait(); #endif // FOMENT_UNIX } |