]> git.mxchange.org Git - simgear.git/commitdiff
For the first time (no pun intended) in almost ten years time (again no
authordurk <durk>
Tue, 27 Jan 2009 22:43:13 +0000 (22:43 +0000)
committerTim Moore <timoore@redhat.com>
Wed, 28 Jan 2009 06:46:55 +0000 (07:46 +0100)
 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.

simgear/timing/sg_time.cxx
simgear/timing/sg_time.hxx

index fb3f30c81c19ee5283e0737658f058c9a522879d..66f4b16e93da0da6d06c707bdd1932a0ff4f4a63 100644 (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) << " "
index 680c161134682a813c5cca24fb9379dce7c227de..ba058f4a864b8f600532655ac34db493f1046452 100644 (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; };