OSDN Git Service

* localtime.cc (time2): Add workaround for spring gap problem. Add
authorcorinna <corinna>
Fri, 12 Jun 2009 15:06:26 +0000 (15:06 +0000)
committercorinna <corinna>
Fri, 12 Jun 2009 15:06:26 +0000 (15:06 +0000)
explaining comment.

winsup/cygwin/ChangeLog
winsup/cygwin/localtime.cc

index 01ffd36..1723b18 100644 (file)
@@ -1,5 +1,10 @@
 2009-06-12  Corinna Vinschen  <corinna@vinschen.de>
 
+       * localtime.cc (time2): Add workaround for spring gap problem.  Add
+       explaining comment.
+
+2009-06-12  Corinna Vinschen  <corinna@vinschen.de>
+
        * Makefile.in (SUBLIBS): Add librt.a.
        (librt.a): New rule to build librt.a.
 
index 6c05851..aa0f735 100644 (file)
@@ -1989,7 +1989,28 @@ time2(struct tm *tmp, void (*funcp) P((const time_t*, long, struct tm*)),
        ** If that fails, try with normalization of seconds.
        */
        t = time2sub(tmp, funcp, offset, okayp, false);
-       return *okayp ? t : time2sub(tmp, funcp, offset, okayp, true);
+       if (*okayp)
+         return t;
+       t = time2sub(tmp, funcp, offset, okayp, true);
+       if (*okayp)
+         return t;
+       /* Workaround for the spring gap problem which results in the
+          autoconf mktime usability test failing.
+          What we do here is this:  The gap has 3600 seconds.  If we
+          subtract 3600 from the tm_sec value and get a valid result,
+          then we can simply add 3600 to the return value and are done.
+          If the result is still not valid, the problem is not the
+          spring gap and we can give up. */
+       struct tm tmp2 = *tmp;
+       tmp2.tm_sec -= 3600;
+       t = time2sub(&tmp2, funcp, offset, okayp, true);
+       if (*okayp)
+         {
+           if (t + 3600 < t)   /* Sanity check */
+             return WRONG;
+           return t + 3600;
+         }
+       return t;
 }
 
 static time_t