]> git.mxchange.org Git - simgear.git/blobdiff - simgear/timing/timestamp.cxx
Merge branch 'maint' into next
[simgear.git] / simgear / timing / timestamp.cxx
index 41c541bef6d5e92b85ebb00b05d273f85db9df0b..7f7773f490174a7d1587e7ba990b450524428772 100644 (file)
@@ -19,7 +19,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 #  include <simgear_config.h>
 #endif
 
-#ifdef HAVE_WINDOWS_H
-#  include <windows.h>
-#endif
-
 #include <simgear/compiler.h>
 
-#ifdef SG_HAVE_STD_INCLUDES
-#  include <ctime>
-#else
-#  include <time.h>
-#endif
+#include <ctime>
 
 #ifdef HAVE_SYS_TIMEB_H
 #  include <sys/timeb.h> // for ftime() and struct timeb
 #endif
 #ifdef HAVE_UNISTD_H
-#  include <unistd.h>    // for gettimeofday()
+#  include <unistd.h>    // for gettimeofday() and the _POSIX_TIMERS define
 #endif
 #ifdef HAVE_SYS_TIME_H
 #  include <sys/time.h>  // for get/setitimer, gettimeofday, struct timeval
 #endif
 
-// -dw- want to use metrowerks time.h
-#ifdef macintosh
+#if defined(_POSIX_TIMERS) && (0 < _POSIX_TIMERS)
 #  include <time.h>
-#  include <timer.h>
+#  include <errno.h>
 #endif
 
 #ifdef WIN32
 
 #include "timestamp.hxx"
 
-
 void SGTimeStamp::stamp() {
 #if defined( WIN32 ) && !defined(__CYGWIN__)
     unsigned int t;
     t = timeGetTime();
-    seconds = 0;
-    usec =  t * 1000;
+    _sec = t / 1000;
+    _nsec = ( t - ( _sec * 1000 ) ) * 1000 * 1000;
+#elif defined(_POSIX_TIMERS) && (0 < _POSIX_TIMERS)
+    struct timespec ts;
+#if defined(_POSIX_MONOTONIC_CLOCK)
+    static clockid_t clockid = CLOCK_MONOTONIC;
+    static bool firstTime = true;
+    if (firstTime) {
+        firstTime = false;
+        // For the first time test if the monotonic clock is available.
+        // If so use this if not use the realtime clock.
+        if (-1 == clock_gettime(clockid, &ts) && errno == EINVAL)
+            clockid = CLOCK_REALTIME;
+    }
+    clock_gettime(clockid, &ts);
+#else
+    clock_gettime(CLOCK_REALTIME, &ts);
+#endif
+    _sec = ts.tv_sec;
+    _nsec = ts.tv_nsec;
 #elif defined( HAVE_GETTIMEOFDAY )
     struct timeval current;
     struct timezone tz;
     // sg_timestamp currtime;
     gettimeofday(&current, &tz);
-    seconds = current.tv_sec;
-    usec = current.tv_usec;
+    _sec = current.tv_sec;
+    _nsec = current.tv_usec * 1000;
 #elif defined( HAVE_GETLOCALTIME )
     SYSTEMTIME current;
     GetLocalTime(&current);
-    seconds = current.wSecond;
-    usec = current.wMilliseconds * 1000;
+    _sec = current.wSecond;
+    _nsec = current.wMilliseconds * 1000 * 1000;
 #elif defined( HAVE_FTIME )
     struct timeb current;
     ftime(&current);
-    seconds = current.time;
-    usec = current.millitm * 1000;
-// -dw- uses time manager
-#elif defined( macintosh )
-    UnsignedWide ms;
-    Microseconds(&ms);
-       
-    seconds = ms.lo / 1000000;
-    usec = ms.lo - ( seconds * 1000000 );
+    _sec = current.time;
+    _nsec = current.millitm * 1000 * 1000;
 #else
 # error Port me
 #endif
 }
 
-// increment the time stamp by the number of microseconds (usec)
-SGTimeStamp operator + (const SGTimeStamp& t, const long& m) {
-#if defined( WIN32 )
-    return SGTimeStamp( 0, t.usec + m );
-#else
-    return SGTimeStamp( t.seconds + ( t.usec + m ) / 1000000,
-                       ( t.usec + m ) % 1000000 );
-#endif
-}
-
-// difference between time stamps in microseconds (usec)
-long operator - (const SGTimeStamp& a, const SGTimeStamp& b)
-{
-#if defined( WIN32 )
-    return a.usec - b.usec;
-#else
-    return 1000000 * (a.seconds - b.seconds) + (a.usec - b.usec);
-#endif
-}