summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorokuoku <mjt@cltn.org>2022-08-28 00:33:42 +0900
committerMike Montague <mikemon@gmail.com>2022-08-28 08:33:01 -0700
commit1e0ca4d994b2a97a73b605479f8ce2175cfe295e (patch)
treec772b031b32559953e9046c67b56337f0ecdaa1a
parentc749f3144ef9e8a9a97fffbc16f1f48b25368a79 (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.cpp18
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
}