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.
This commit is contained in:
Eli Zaretskii 2011-04-18 11:33:58 +03:00
parent 6470c3c6a9
commit 97a9309556
3 changed files with 30 additions and 0 deletions

View 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).

View 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

View file

@ -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 ()
{