Fix termination sequence on Windows wrt interval timers.

src/w32proc.c <disable_itimers>: New static flag.
 (init_timers): Initialize it to zero, after creating the critical
 sections used by the timer threads.
 (term_timers): Set to 1 before deleting the critical sections.
 (getitimer, setitimer): If disable_itimers is non-zero, return an
 error indication without doing anything.  Reported by Fabrice
 Popineau <fabrice.popineau@supelec.fr> as part of bug#12544.
This commit is contained in:
Eli Zaretskii 2012-10-01 11:29:14 +02:00
parent b3a4c387c0
commit f0e5f2255f
3 changed files with 33 additions and 4 deletions

View file

@ -1,3 +1,17 @@
2012-10-01 Eli Zaretskii <eliz@gnu.org>
* w32proc.c <disable_itimers>: New static flag.
(init_timers): Initialize it to zero, after creating the critical
sections used by the timer threads.
(term_timers): Set to 1 before deleting the critical sections.
(getitimer, setitimer): If disable_itimers is non-zero, return an
error indication without doing anything. Reported by Fabrice
Popineau <fabrice.popineau@supelec.fr> as part of bug#12544.
* emacs.c (shut_down_emacs) [WINDOWSNT]: Move the call to
term_ntproc after all the other bookkeeping, to get timers working
as long as possible.
2012-10-01 Paul Eggert <eggert@cs.ucla.edu>
* xdisp.c (syms_of_xdisp): Default message-log-max to 1000, not 100.

View file

@ -1912,10 +1912,6 @@ shut_down_emacs (int sig, Lisp_Object stuff)
unrequest_sigio ();
ignore_sigio ();
#ifdef WINDOWSNT
term_ntproc (0);
#endif
/* Do this only if terminating normally, we want glyph matrices
etc. in a core dump. */
if (sig == 0 || sig == SIGTERM)
@ -1935,6 +1931,10 @@ shut_down_emacs (int sig, Lisp_Object stuff)
#ifdef HAVE_LIBXML2
xml_cleanup_parser ();
#endif
#ifdef WINDOWSNT
term_ntproc (0);
#endif
}

View file

@ -272,6 +272,9 @@ struct itimer_data {
static clock_t ticks_now;
static struct itimer_data real_itimer, prof_itimer;
static clock_t clocks_min;
/* If non-zero, itimers are disabled. Used during shutdown, when we
delete the critical sections used by the timer threads. */
static int disable_itimers;
static CRITICAL_SECTION crit_real, crit_prof;
@ -448,6 +451,10 @@ term_timers (void)
if (prof_itimer.timer_thread)
stop_timer_thread (ITIMER_PROF);
/* We are going to delete the critical sections, so timers cannot
work after this. */
disable_itimers = 1;
DeleteCriticalSection (&crit_real);
DeleteCriticalSection (&crit_prof);
DeleteCriticalSection (&crit_sig);
@ -465,6 +472,8 @@ init_timers (void)
InitializeCriticalSection (&crit_real);
InitializeCriticalSection (&crit_prof);
InitializeCriticalSection (&crit_sig);
disable_itimers = 0;
}
static int
@ -525,6 +534,9 @@ getitimer (int which, struct itimerval *value)
__int64 usecs;
CRITICAL_SECTION *crit;
if (disable_itimers)
return -1;
ticks_now = clock ();
if (!value)
@ -569,6 +581,9 @@ setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
__int64 usecs;
CRITICAL_SECTION *crit;
if (disable_itimers)
return -1;
/* Posix systems expect timer values smaller than the resolution of
the system clock be rounded up to the clock resolution. First
time we are called, measure the clock tick resolution. */