summaryrefslogtreecommitdiff
path: root/src/w32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/w32.c')
-rw-r--r--src/w32.c22
1 files changed, 22 insertions, 0 deletions
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 ()
{