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)
|
FIND_PACKAGE(X11)
|
||||||
# Some Unicies need explicit linkage to the Math library or the build fails.
|
# Some Unicies need explicit linkage to the Math library or the build fails.
|
||||||
FIND_LIBRARY(MATH_LIBRARY m)
|
FIND_LIBRARY(MATH_LIBRARY m)
|
||||||
|
IF( CMAKE_SYSTEM MATCHES "Linux" )
|
||||||
|
FIND_LIBRARY( RT_LIBRARY rt )
|
||||||
|
ENDIF( CMAKE_SYSTEM MATCHES "Linux" )
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
# Make the headers visible to everything
|
# Make the headers visible to everything
|
||||||
|
@ -331,7 +331,7 @@ ADD_LIBRARY(${LIB_NAME}
|
|||||||
LINK_INTERNAL(${LIB_NAME}
|
LINK_INTERNAL(${LIB_NAME}
|
||||||
OpenThreads
|
OpenThreads
|
||||||
)
|
)
|
||||||
LINK_EXTERNAL(${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} )
|
LINK_CORELIB_DEFAULT(${LIB_NAME} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIBRARY} ${RT_LIBRARY} )
|
||||||
|
|
||||||
INCLUDE(ModuleInstall OPTIONAL)
|
INCLUDE(ModuleInstall OPTIONAL)
|
||||||
|
@ -71,8 +71,7 @@ Timer* Timer::instance()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
#include <unistd.h>
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
Timer::Timer( void )
|
Timer::Timer( void )
|
||||||
{
|
{
|
||||||
@ -81,11 +80,24 @@ Timer* Timer::instance()
|
|||||||
setStartTick();
|
setStartTick();
|
||||||
}
|
}
|
||||||
|
|
||||||
Timer_t Timer::tick() const
|
#if defined(_POSIX_TIMERS) && ( _POSIX_TIMERS > 0 ) && defined(_POSIX_MONOTONIC_CLOCK)
|
||||||
{
|
#include <time.h>
|
||||||
struct timeval tv;
|
|
||||||
gettimeofday(&tv, NULL);
|
Timer_t Timer::tick() const
|
||||||
return ((osg::Timer_t)tv.tv_sec)*1000000+(osg::Timer_t)tv.tv_usec;
|
{
|
||||||
}
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user