From Pau Garcia i Quiles, "On Linux/Unix, when you change the system time (for instance, using

settimeofday), OSG animations will freeze your application because
osg::Timer uses gettimeofday internally on non-Win32 platforms. This
is wrong and should be replace with times(2) or clock_gettime(2).

The attached patch fixes the issue in a binary-compatible way by using
clock_gettime when it's available, and falling back to gettimeofday
when it's not."
This commit is contained in:
Robert Osfield
2009-11-18 13:00:35 +00:00
parent 2f854d4978
commit 2a0497e2c1
3 changed files with 25 additions and 10 deletions

View File

@@ -71,8 +71,7 @@ Timer* Timer::instance()
}
#else
#include <sys/time.h>
#include <unistd.h>
Timer::Timer( void )
{
@@ -81,11 +80,24 @@ Timer* Timer::instance()
setStartTick();
}
Timer_t Timer::tick() const
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((osg::Timer_t)tv.tv_sec)*1000000+(osg::Timer_t)tv.tv_usec;
}
#if defined(_POSIX_TIMERS) && ( _POSIX_TIMERS > 0 ) && defined(_POSIX_MONOTONIC_CLOCK)
#include <time.h>
Timer_t Timer::tick() const
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ((osg::Timer_t)ts.tv_sec)*1000000+(osg::Timer_t)ts.tv_nsec/1000;
}
#else
#include <sys/time.h>
Timer_t Timer::tick() const
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((osg::Timer_t)tv.tv_sec)*1000000+(osg::Timer_t)tv.tv_usec;
}
#endif
#endif