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:
parent
6470c3c6a9
commit
97a9309556
3 changed files with 30 additions and 0 deletions
|
@ -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).
|
||||
|
|
|
@ -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
|
||||
|
|
22
src/w32.c
22
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 ()
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue