+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.
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;
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);
InitializeCriticalSection (&crit_real);
InitializeCriticalSection (&crit_prof);
InitializeCriticalSection (&crit_sig);
+
+ disable_itimers = 0;
}
static int
__int64 usecs;
CRITICAL_SECTION *crit;
+ if (disable_itimers)
+ return -1;
+
ticks_now = clock ();
if (!value)
__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. */