From 97a9309556465557781fb95b2bc5a44f7b4520b9 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 18 Apr 2011 11:33:58 +0300 Subject: [PATCH] Fix a bug in time functions when timezone is changed on Windows. src/s/ms-w32.h (localtime): Redirect to sys_localtime. src/w32.c: Include . (sys_localtime): New function. --- src/ChangeLog | 7 +++++++ src/s/ms-w32.h | 1 + src/w32.c | 22 ++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index cfa9426c882..faf9564a835 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2011-04-18 Eli Zaretskii + + * s/ms-w32.h (localtime): Redirect to sys_localtime. + + * w32.c: Include . + (sys_localtime): New function. + 2011-04-13 Chong Yidong * xdisp.c (init_xdisp): Initialize echo_area_window (Bug#6451). diff --git a/src/s/ms-w32.h b/src/s/ms-w32.h index 2b0a60cfab9..b9e57687a09 100644 --- a/src/s/ms-w32.h +++ b/src/s/ms-w32.h @@ -236,6 +236,7 @@ along with GNU Emacs. If not, see . */ #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 diff --git a/src/w32.c b/src/w32.c index 8dbf0cf8f19..804d6d0c4bc 100644 --- a/src/w32.c +++ b/src/w32.c @@ -35,6 +35,7 @@ along with GNU Emacs. If not, see . */ #include /* for _mbspbrk */ #include #include +#include /* must include CRT headers *before* config.h */ @@ -65,6 +66,8 @@ along with GNU Emacs. If not, see . */ #undef strerror +#undef localtime + #include "lisp.h" #include @@ -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 () { -- 2.39.2