Fix termination sequence on Windows wrt interval timers.
authorEli Zaretskii <eliz@gnu.org>
Mon, 1 Oct 2012 09:29:14 +0000 (11:29 +0200)
committerEli Zaretskii <eliz@gnu.org>
Mon, 1 Oct 2012 09:29:14 +0000 (11:29 +0200)
 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.

src/ChangeLog
src/emacs.c
src/w32proc.c

index 41b2d24..cfa80ed 100644 (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.
index 05affee..f3f2081 100644 (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
 }
 
 
index fb87299..159d6e0 100644 (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.  */