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:
parent
2f854d4978
commit
2a0497e2c1
@ -152,6 +152,9 @@ IF(UNIX)
|
||||
FIND_PACKAGE(X11)
|
||||
# Some Unicies need explicit linkage to the Math library or the build fails.
|
||||
FIND_LIBRARY(MATH_LIBRARY m)
|
||||
IF( CMAKE_SYSTEM MATCHES "Linux" )
|
||||
FIND_LIBRARY( RT_LIBRARY rt )
|
||||
ENDIF( CMAKE_SYSTEM MATCHES "Linux" )
|
||||
ENDIF()
|
||||
|
||||
# Make the headers visible to everything
|
||||
|
@ -331,7 +331,7 @@ ADD_LIBRARY(${LIB_NAME}
|
||||
LINK_INTERNAL(${LIB_NAME}
|
||||
OpenThreads
|
||||
)
|
||||
LINK_EXTERNAL(${LIB_NAME} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIBRARY} )
|
||||
LINK_CORELIB_DEFAULT(${LIB_NAME} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIBRARY} )
|
||||
LINK_EXTERNAL(${LIB_NAME} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIBRARY} ${RT_LIBRARY} )
|
||||
LINK_CORELIB_DEFAULT(${LIB_NAME} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIBRARY} ${RT_LIBRARY} )
|
||||
|
||||
INCLUDE(ModuleInstall OPTIONAL)
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
#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
|
||||
|
Loading…
Reference in New Issue
Block a user