]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix a bug in time functions when timezone is changed on Windows.
authorEli Zaretskii <eliz@gnu.org>
Mon, 18 Apr 2011 08:33:58 +0000 (11:33 +0300)
committerEli Zaretskii <eliz@gnu.org>
Mon, 18 Apr 2011 08:33:58 +0000 (11:33 +0300)
 src/s/ms-w32.h (localtime): Redirect to sys_localtime.
 src/w32.c: Include <time.h>.
 (sys_localtime): New function.

src/ChangeLog
src/s/ms-w32.h
src/w32.c

index cfa9426c882bf9be5e5ec38a57b0cebd52525189..faf9564a835e0f65cfe64b0ba26f0d4888e6675c 100644 (file)
@@ -1,3 +1,10 @@
+2011-04-18  Eli Zaretskii  <eliz@gnu.org>
+
+       * s/ms-w32.h (localtime): Redirect to sys_localtime.
+
+       * w32.c: Include <time.h>.
+       (sys_localtime): New function.
+
 2011-04-13  Chong Yidong  <cyd@stupidchicken.com>
 
        * xdisp.c (init_xdisp): Initialize echo_area_window (Bug#6451).
index 2b0a60cfab905ce5a32340c49cf5dfe66916000f..b9e57687a09573d732dd0d4ad6d1f00aa761a734 100644 (file)
@@ -236,6 +236,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define dup2    sys_dup2
 #define fopen   sys_fopen
 #define link    sys_link
+#define localtime sys_localtime
 #define mkdir   sys_mkdir
 #undef mktemp
 #define mktemp  sys_mktemp
index 8dbf0cf8f19d3fb252a52fc1c31db2c8226e5198..804d6d0c4bc11a2b6879fcfdc56f1ebf98868712 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -35,6 +35,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <mbstring.h>  /* for _mbspbrk */
 #include <math.h>
 #include <setjmp.h>
+#include <time.h>
 
 /* must include CRT headers *before* config.h */
 
@@ -65,6 +66,8 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #undef strerror
 
+#undef localtime
+
 #include "lisp.h"
 
 #include <pwd.h>
@@ -1961,6 +1964,12 @@ gettimeofday (struct timeval *tv, struct timezone *tz)
 
   tv->tv_sec = tb.time;
   tv->tv_usec = tb.millitm * 1000L;
+  /* Implementation note: _ftime sometimes doesn't update the dstflag
+     according to the new timezone when the system timezone is
+     changed.  We could fix that by using GetSystemTime and
+     GetTimeZoneInformation, but that doesn't seem necessary, since
+     Emacs always calls gettimeofday with the 2nd argument NULL (see
+     EMACS_GET_TIME).  */
   if (tz)
     {
       tz->tz_minuteswest = tb.timezone;        /* minutes west of Greenwich  */
@@ -5676,6 +5685,19 @@ sys_write (int fd, const void * buffer, unsigned int count)
   return nchars;
 }
 
+/* The Windows CRT functions are "optimized for speed", so they don't
+   check for timezone and DST changes if they were last called less
+   than 1 minute ago (see http://support.microsoft.com/kb/821231).  So
+   all Emacs features that repeatedly call time functions (e.g.,
+   display-time) are in real danger of missing timezone and DST
+   changes.  Calling tzset before each localtime call fixes that.  */
+struct tm *
+sys_localtime (const time_t *t)
+{
+  tzset ();
+  return localtime (t);
+}
+
 static void
 check_windows_init_file ()
 {