summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2012-10-01 11:29:14 +0200
committerEli Zaretskii <eliz@gnu.org>2012-10-01 11:29:14 +0200
commitf0e5f2255f62cf59eaf84e642ada10f64b1fc9d1 (patch)
tree22b42cbd9b532331b88f87abd487aa384fa5ea8e
parentb3a4c387c0e768de92b7969b2adb6670f10bda5d (diff)
downloademacs-f0e5f2255f62cf59eaf84e642ada10f64b1fc9d1.tar.gz
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.
-rw-r--r--src/ChangeLog14
-rw-r--r--src/emacs.c8
-rw-r--r--src/w32proc.c15
3 files changed, 33 insertions, 4 deletions
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 <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.
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. */