diff options
author | Eli Zaretskii <eliz@gnu.org> | 2011-04-18 11:33:58 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2011-04-18 11:33:58 +0300 |
commit | 97a9309556465557781fb95b2bc5a44f7b4520b9 (patch) | |
tree | d833c01701ab24492429351fd77b99ef5c83a2ae /src | |
parent | 6470c3c6a99ed0d1eae68bbbe1d0a3f6ca8b4983 (diff) | |
download | emacs-97a9309556465557781fb95b2bc5a44f7b4520b9.tar.gz |
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 <time.h>.
(sys_localtime): New function.
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 7 | ||||
-rw-r--r-- | src/s/ms-w32.h | 1 | ||||
-rw-r--r-- | src/w32.c | 22 |
3 files changed, 30 insertions, 0 deletions
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 <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). 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 <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 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 <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 () { |