summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2011-04-18 11:33:58 +0300
committerEli Zaretskii <eliz@gnu.org>2011-04-18 11:33:58 +0300
commit97a9309556465557781fb95b2bc5a44f7b4520b9 (patch)
treed833c01701ab24492429351fd77b99ef5c83a2ae /src
parent6470c3c6a99ed0d1eae68bbbe1d0a3f6ca8b4983 (diff)
downloademacs-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/ChangeLog7
-rw-r--r--src/s/ms-w32.h1
-rw-r--r--src/w32.c22
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 ()
{