]> git.mxchange.org Git - simgear.git/blobdiff - simgear/timing/timestamp.cxx
HTTP: Rename urlretrieve/urlload to save/load.
[simgear.git] / simgear / timing / timestamp.cxx
index a2eae9eef6b2b02af58cee940cd71e072526bc12..297f665aebcbd055003e59e42952263fb978d9ae 100644 (file)
@@ -31,6 +31,7 @@
 #include <simgear/compiler.h>
 
 #include <ctime>
+#include <cerrno>
 
 #ifdef HAVE_SYS_TIMEB_H
 #  include <sys/timeb.h> // for ftime() and struct timeb
@@ -44,7 +45,6 @@
 
 #if defined(_POSIX_TIMERS) && (0 < _POSIX_TIMERS)
 #  include <time.h>
-#  include <errno.h>
 #endif
 
 #ifdef WIN32
@@ -255,6 +255,24 @@ bool SGTimeStamp::sleepFor(const SGTimeStamp& reltime)
     // Don't know, but may be win32 has something better today??
     Sleep(static_cast<DWORD>(reltime.toMSecs()));
     return true;
+#elif defined __APPLE__
+    // the generic version below behaves badly on Mac; use nanosleep directly,
+    // similar to the POSIX timers version
+    struct timespec ts;
+    ts.tv_sec = reltime._sec;
+    ts.tv_nsec = reltime._nsec;
+    
+    for (;;) {
+        struct timespec rem;
+        int ret = nanosleep(&ts, &rem);
+        if (-1 == ret && errno != EINTR)
+            return false;
+        if (ret == 0)
+            break;
+        // Use the remainder for the next cycle.
+        ts = rem;
+    }
+    return true;
 #else
     SGTimeStamp abstime;
     abstime.stamp();