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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user