For the first time (no pun intended) in almost ten years time (again no

pun intended) that I'm touching the time library.

 Brian Schack reported that the traffic scheduler messes up the timestamps
 of the atlas network output. As it turns out, the c library functions
 asctime, and gmtime use a static copy of the tm struct to do the internal
 formatting. Our linux port of the SGTime class, incidentally, also stored
 it's master time stamp in this very same struct. Thus, formatting an
 arbitrary time value, would have the unwanted side effect of time travel.
 Usually, this would go unnoticed, because the actual time parameters would
 be updated before any damage could be done. But unwanted side effects, as
 in Brian's example could occur.

 On the MSVC port this appears to not have been a problem. Since that port
 used a copy of the tm struct to store it's master time stamps. Since the
 MSVC code also compiles cleanly on linux, it seems to be the way to go to
 use that approach. In addition, it also removes some conditional compile
 directives.

 I've only run a short test, but didn't see any undesirable side effects.
This commit is contained in:
durk
2009-01-27 22:43:13 +00:00
committed by Tim Moore
parent ce2a6cfe5c
commit e3fc89890c
2 changed files with 3 additions and 22 deletions

View File

@@ -195,9 +195,9 @@ void SGTime::update( double lon_rad, double lat_rad,
{
double gst_precise, gst_course;
#if defined(_MSC_VER) || defined(__MINGW32__)
tm * gmt = &m_gmt;
#endif
SG_LOG( SG_EVENT, SG_DEBUG, "Updating time" );
@@ -213,11 +213,8 @@ void SGTime::update( double lon_rad, double lat_rad,
<< " warp = " << warp );
// get GMT break down for current time
#if defined(_MSC_VER) || defined(__MINGW32__)
memcpy( gmt, gmtime(&cur_time), sizeof(tm) );
#else
gmt = gmtime(&cur_time);
#endif
SG_LOG( SG_EVENT, SG_DEBUG,
" Current GMT = " << gmt->tm_mon+1 << "/"
<< gmt->tm_mday << "/" << (1900 + gmt->tm_year) << " "
@@ -367,12 +364,8 @@ double sgTimeCalcMJD(int mn, double dy, int yr) {
// since 1900 jan 0.5), mjd.
double sgTimeCurrentMJD( time_t ct, long int warp ) {
#if defined(_MSC_VER) || defined(__MINGW32__)
struct tm m_gmt; // copy of system gmtime(&time_t) structure
struct tm *gmt = &m_gmt;
#else
struct tm *gmt;
#endif
// get current Unix calendar time (in seconds)
// warp += warp_delta;
@@ -387,11 +380,7 @@ double sgTimeCurrentMJD( time_t ct, long int warp ) {
<< " warp = " << warp );
// get GMT break down for current time
#if defined(_MSC_VER) || defined(__MINGW32__)
memcpy( gmt, gmtime(&cur_time), sizeof(tm) );
#else
gmt = gmtime(&cur_time);
#endif
SG_LOG( SG_EVENT, SG_DEBUG,
" Current GMT = " << gmt->tm_mon+1 << "/"
<< gmt->tm_mday << "/" << (1900 + gmt->tm_year) << " "

View File

@@ -73,11 +73,7 @@ private:
time_t cur_time;
// Break down of equivalent GMT time
#if defined(_MSC_VER) || defined(__MINGW32__)
struct tm m_gmt; // copy of system gmtime(&time_t) structure
#else
struct tm *gmt;
#endif
// offset of local time relative to GMT
time_t local_offset;
@@ -170,11 +166,7 @@ public:
inline const char * get_zonename() const { return zonename.c_str(); }
/** @return GMT in a "brokent down" tm structure */
#if defined(_MSC_VER) || defined(__MINGW32__)
inline struct tm* getGmt()const { return (struct tm *)&m_gmt; };
#else
inline struct tm* getGmt()const { return gmt; };
#endif
/** @return julian date */
inline double getJD() const { return jd; };