From: Eli Zaretskii Date: Mon, 1 Oct 2012 09:29:14 +0000 (+0200) Subject: Fix termination sequence on Windows wrt interval timers. X-Git-Tag: emacs-24.2.90~241^2~62 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f0e5f2255f62cf59eaf84e642ada10f64b1fc9d1;p=emacs.git Fix termination sequence on Windows wrt interval timers. src/w32proc.c : 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 as part of bug#12544. --- diff --git a/src/ChangeLog b/src/ChangeLog index 41b2d24b968..cfa80ed8899 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,17 @@ +2012-10-01 Eli Zaretskii + + * w32proc.c : 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 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 * xdisp.c (syms_of_xdisp): Default message-log-max to 1000, not 100. diff --git a/src/emacs.c b/src/emacs.c index 05affeefde7..f3f2081e2e9 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -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 } diff --git a/src/w32proc.c b/src/w32proc.c index fb872990bd0..159d6e00957 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -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. */