Simplify timing code.
Assumes we have timegm on Unix, and use _mkgmtime on Windows. This means we never need to use ftime() / timeb.h
This commit is contained in:
@@ -239,7 +239,6 @@ endif(SYSTEM_EXPAT)
|
||||
|
||||
check_include_file(inttypes.h HAVE_INTTYPES_H)
|
||||
check_include_file(sys/time.h HAVE_SYS_TIME_H)
|
||||
check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
|
||||
check_include_file(unistd.h HAVE_UNISTD_H)
|
||||
check_include_file(windows.h HAVE_WINDOWS_H)
|
||||
|
||||
@@ -257,13 +256,18 @@ else()
|
||||
endif(ENABLE_RTI)
|
||||
|
||||
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
|
||||
check_function_exists(ftime HAVE_FTIME)
|
||||
check_function_exists(timegm HAVE_TIMEGM)
|
||||
check_function_exists(rint HAVE_RINT)
|
||||
check_function_exists(mkdtemp HAVE_MKDTEMP)
|
||||
check_function_exists(bcopy HAVE_BCOPY)
|
||||
check_function_exists(mmap HAVE_MMAP)
|
||||
|
||||
if (NOT MSVC)
|
||||
check_function_exists(timegm HAVE_TIMEGM)
|
||||
if (NOT HAVE_TIMEGM)
|
||||
message(FATAL_ERROR "Non-Windows platforms must support timegm()")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(HAVE_UNISTD_H)
|
||||
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
|
||||
check_cxx_source_compiles(
|
||||
|
||||
@@ -21,10 +21,7 @@
|
||||
// $Id$
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <simgear_config.h>
|
||||
#endif
|
||||
|
||||
#include <simgear_config.h>
|
||||
#include <simgear/compiler.h>
|
||||
|
||||
#include <errno.h> // for errno
|
||||
@@ -39,9 +36,6 @@
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
# include <sys/time.h> // for get/setitimer, gettimeofday, struct timeval
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TIMEB_H
|
||||
# include <sys/timeb.h> // for ftime() and struct timeb
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h> // for gettimeofday()
|
||||
#endif
|
||||
@@ -350,26 +344,6 @@ double sgTimeCalcGST( double mjd ) {
|
||||
}
|
||||
|
||||
|
||||
#if defined( HAVE_TIMEGM )
|
||||
// ignore this function
|
||||
#elif defined( MK_TIME_IS_GMT )
|
||||
// ignore this function
|
||||
#else // ! defined ( MK_TIME_IS_GMT )
|
||||
|
||||
// Fix up timezone if using ftime()
|
||||
static long int fix_up_timezone( long int timezone_orig ) {
|
||||
# if !defined( HAVE_GETTIMEOFDAY ) && defined( HAVE_FTIME )
|
||||
// ftime() needs a little extra help finding the current timezone
|
||||
struct timeb current;
|
||||
ftime(¤t);
|
||||
return( current.timezone * 60 );
|
||||
# else
|
||||
return( timezone_orig );
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/******************************************************************
|
||||
* The following are some functions that were included as SGTime
|
||||
* members, although they currently don't make use of any of the
|
||||
@@ -378,28 +352,6 @@ double sgTimeCalcGST( double mjd ) {
|
||||
|
||||
// Return time_t for Sat Mar 21 12:00:00 GMT
|
||||
//
|
||||
// On many systems it is ambiguous if mktime() assumes the input is in
|
||||
// GMT, or local timezone. To address this, a new function called
|
||||
// timegm() is appearing. It works exactly like mktime() but
|
||||
// explicitely interprets the input as GMT.
|
||||
//
|
||||
// timegm() is available and documented under FreeBSD. It is
|
||||
// available, but completely undocumented on my current Debian 2.1
|
||||
// distribution.
|
||||
//
|
||||
// In the absence of timegm() we have to guess what mktime() might do.
|
||||
//
|
||||
// Many older BSD style systems have a mktime() that assumes the input
|
||||
// time in GMT. But FreeBSD explicitly states that mktime() assumes
|
||||
// local time zone
|
||||
//
|
||||
// The mktime() on many SYSV style systems (such as Linux) usually
|
||||
// returns its result assuming you have specified the input time in
|
||||
// your local timezone. Therefore, in the absence if timegm() you
|
||||
// have to go to extra trouble to convert back to GMT.
|
||||
//
|
||||
// If you are having problems with incorrectly positioned astronomical
|
||||
// bodies, this is a really good place to start looking.
|
||||
|
||||
time_t sgTimeGetGMT(int year, int month, int day, int hour, int min, int sec)
|
||||
{
|
||||
@@ -413,89 +365,15 @@ time_t sgTimeGetGMT(int year, int month, int day, int hour, int min, int sec)
|
||||
mt.tm_sec = sec;
|
||||
mt.tm_isdst = -1; // let the system determine the proper time zone
|
||||
|
||||
// For now we assume that if daylight is not defined in
|
||||
// /usr/include/time.h that we have a machine with a mktime() that
|
||||
// assumes input is in GMT ... this only matters if we are
|
||||
// building on a system that does not have timegm()
|
||||
#if !defined(HAVE_DAYLIGHT)
|
||||
# define MK_TIME_IS_GMT 1
|
||||
#endif
|
||||
|
||||
#if defined( HAVE_TIMEGM )
|
||||
#if defined(SG_WINDOWS)
|
||||
return _mkgmtime(&mt);
|
||||
#elif defined( HAVE_TIMEGM )
|
||||
return ( timegm(&mt) );
|
||||
#elif defined( MK_TIME_IS_GMT )
|
||||
time_t ret = mktime(&mt);
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
ret -= _timezone;
|
||||
#endif
|
||||
|
||||
// This is necessary as some mktime() calls may
|
||||
// try to access the system timezone files
|
||||
// if this open fails errno is set to 2
|
||||
// CYGWIN for one does this
|
||||
// if ( errno ) {
|
||||
// perror( "sgTimeGetGMT()" );
|
||||
// errno = 0;
|
||||
// }
|
||||
|
||||
// reset errno in any event.
|
||||
errno = 0;
|
||||
|
||||
return ret;
|
||||
#else // ! defined ( MK_TIME_IS_GMT )
|
||||
|
||||
// timezone seems to work as a proper offset for Linux & Solaris
|
||||
# if defined( __linux__ ) || defined(__sun) ||defined(__CYGWIN__)
|
||||
# define TIMEZONE_OFFSET_WORKS 1
|
||||
# endif
|
||||
|
||||
#if defined(__CYGWIN__)
|
||||
#define TIMEZONE _timezone
|
||||
#else
|
||||
#define TIMEZONE timezone
|
||||
#error Unix platforms should have timegm
|
||||
#endif
|
||||
|
||||
time_t start = mktime(&mt);
|
||||
|
||||
SG_LOG( SG_EVENT, SG_DEBUG, "start1 = " << start );
|
||||
// the ctime() call can screw up time progression on some versions
|
||||
// of Linux
|
||||
// fgPrintf( SG_EVENT, SG_DEBUG, "start2 = %s", ctime(&start));
|
||||
SG_LOG( SG_EVENT, SG_DEBUG, "(tm_isdst = " << mt.tm_isdst << ")" );
|
||||
|
||||
TIMEZONE = fix_up_timezone( TIMEZONE );
|
||||
|
||||
# if defined( TIMEZONE_OFFSET_WORKS )
|
||||
SG_LOG( SG_EVENT, SG_DEBUG,
|
||||
"start = " << start << ", timezone = " << TIMEZONE );
|
||||
return( start - TIMEZONE );
|
||||
# else // ! defined( TIMEZONE_OFFSET_WORKS )
|
||||
|
||||
daylight = mt.tm_isdst;
|
||||
if ( daylight > 0 ) {
|
||||
daylight = 1;
|
||||
} else if ( daylight < 0 ) {
|
||||
SG_LOG( SG_EVENT, SG_WARN,
|
||||
"OOOPS, problem in sg_time.cxx, no daylight savings info." );
|
||||
}
|
||||
|
||||
long int offset = -(TIMEZONE / 3600 - daylight);
|
||||
|
||||
SG_LOG( SG_EVENT, SG_DEBUG, " Raw time zone offset = " << TIMEZONE );
|
||||
SG_LOG( SG_EVENT, SG_DEBUG, " Daylight Savings = " << daylight );
|
||||
SG_LOG( SG_EVENT, SG_DEBUG, " Local hours from GMT = " << offset );
|
||||
|
||||
long int start_gmt = start - TIMEZONE + (daylight * 3600);
|
||||
|
||||
SG_LOG( SG_EVENT, SG_DEBUG, " March 21 noon (CST) = " << start );
|
||||
|
||||
return ( start_gmt );
|
||||
# endif // ! defined( TIMEZONE_OFFSET_WORKS )
|
||||
#endif // ! defined ( MK_TIME_IS_GMT )
|
||||
}
|
||||
|
||||
|
||||
// format time
|
||||
char* sgTimeFormatTime( const struct tm* p, char* buf )
|
||||
{
|
||||
|
||||
@@ -24,18 +24,12 @@
|
||||
// $Id$
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <simgear_config.h>
|
||||
#endif
|
||||
|
||||
#include <simgear_config.h>
|
||||
#include <simgear/compiler.h>
|
||||
|
||||
#include <ctime>
|
||||
#include <cerrno>
|
||||
|
||||
#ifdef HAVE_SYS_TIMEB_H
|
||||
# include <sys/timeb.h> // for ftime() and struct timeb
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h> // for gettimeofday() and the _POSIX_TIMERS define
|
||||
#endif
|
||||
@@ -49,10 +43,6 @@
|
||||
|
||||
#ifdef WIN32
|
||||
# include <windows.h>
|
||||
# if defined( __CYGWIN__ ) || defined( __CYGWIN32__ )
|
||||
# define NEAR /* */
|
||||
# define FAR /* */
|
||||
# endif
|
||||
# include <mmsystem.h>
|
||||
#endif
|
||||
|
||||
@@ -81,7 +71,8 @@ static clockid_t getClockId()
|
||||
|
||||
#endif
|
||||
|
||||
void SGTimeStamp::stamp() {
|
||||
void SGTimeStamp::stamp()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
unsigned int t;
|
||||
t = timeGetTime();
|
||||
@@ -102,11 +93,6 @@ void SGTimeStamp::stamp() {
|
||||
GetLocalTime(¤t);
|
||||
_sec = current.wSecond;
|
||||
_nsec = current.wMilliseconds * 1000 * 1000;
|
||||
#elif defined( HAVE_FTIME )
|
||||
struct timeb current;
|
||||
ftime(¤t);
|
||||
_sec = current.time;
|
||||
_nsec = current.millitm * 1000 * 1000;
|
||||
#else
|
||||
# error Port me
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user