From: durk Date: Tue, 27 Jan 2009 22:43:13 +0000 (+0000) Subject: For the first time (no pun intended) in almost ten years time (again no X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=e3fc89890c8f5cb4c09f936209e46878d2f2ea67;p=simgear.git 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. --- diff --git a/simgear/timing/sg_time.cxx b/simgear/timing/sg_time.cxx index fb3f30c8..66f4b16e 100644 --- a/simgear/timing/sg_time.cxx +++ b/simgear/timing/sg_time.cxx @@ -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) << " " diff --git a/simgear/timing/sg_time.hxx b/simgear/timing/sg_time.hxx index 680c1611..ba058f4a 100644 --- a/simgear/timing/sg_time.hxx +++ b/simgear/timing/sg_time.hxx @@ -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; };