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:
parent
b3a4c387c0
commit
f0e5f2255f
3 changed files with 33 additions and 4 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Add table
Reference in a new issue