emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r110354: Port timers to OpenBSD, plus


From: Paul Eggert
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r110354: Port timers to OpenBSD, plus check for timer failures.
Date: Wed, 03 Oct 2012 17:10:47 -0700
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 110354
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Wed 2012-10-03 17:10:47 -0700
message:
  Port timers to OpenBSD, plus check for timer failures.
  
  OpenBSD problem reported by Han Boetes.
  * profiler.c (setup_cpu_timer): Check for failure of timer_settime
  and/or setitimer.
  (Fprofiler_cpu_stop): Don't assume HAVE_SETITIMER.
  * syssignal.h (HAVE_ITIMERSPEC): New macro.  This is for platforms
  like OpenBSD, which has timer_settime but does not declare it.
  OpenBSD does not define SIGEV_SIGNAL, so use that when deciding
  whether to use itimerspec-related primitives.  All uses of
  HAVE_TIMER_SETTIME replaced with HAVE_ITIMERSPEC.
modified:
  ChangeLog
  src/atimer.c
  src/profiler.c
  src/syssignal.h
=== modified file 'ChangeLog'
--- a/ChangeLog 2012-09-30 04:19:32 +0000
+++ b/ChangeLog 2012-10-04 00:10:47 +0000
@@ -1,3 +1,16 @@
+2012-10-04  Paul Eggert  <address@hidden>
+
+       Port timers to OpenBSD, plus check for timer failures.
+       OpenBSD problem reported by Han Boetes.
+       * profiler.c (setup_cpu_timer): Check for failure of timer_settime
+       and/or setitimer.
+       (Fprofiler_cpu_stop): Don't assume HAVE_SETITIMER.
+       * syssignal.h (HAVE_ITIMERSPEC): New macro.  This is for platforms
+       like OpenBSD, which has timer_settime but does not declare it.
+       OpenBSD does not define SIGEV_SIGNAL, so use that when deciding
+       whether to use itimerspec-related primitives.  All uses of
+       HAVE_TIMER_SETTIME replaced with HAVE_ITIMERSPEC.
+
 2012-09-30  Paul Eggert  <address@hidden>
 
        Merge from gnulib, incorporating:

=== modified file 'src/atimer.c'
--- a/src/atimer.c      2012-09-27 01:06:23 +0000
+++ b/src/atimer.c      2012-10-04 00:10:47 +0000
@@ -42,7 +42,7 @@
 
 /* The alarm timer and whether it was properly initialized, if
    POSIX timers are available.  */
-#ifdef HAVE_TIMER_SETTIME
+#ifdef HAVE_ITIMERSPEC
 static timer_t alarm_timer;
 static bool alarm_timer_ok;
 #endif
@@ -296,7 +296,7 @@
 #endif
       EMACS_TIME now, interval;
 
-#ifdef HAVE_TIMER_SETTIME
+#ifdef HAVE_ITIMERSPEC
       if (alarm_timer_ok)
        {
          struct itimerspec ispec;
@@ -416,7 +416,7 @@
 init_atimer (void)
 {
   struct sigaction action;
-#ifdef HAVE_TIMER_SETTIME
+#ifdef HAVE_ITIMERSPEC
   struct sigevent sigev;
   sigev.sigev_notify = SIGEV_SIGNAL;
   sigev.sigev_signo = SIGALRM;

=== modified file 'src/profiler.c'
--- a/src/profiler.c    2012-10-02 19:38:10 +0000
+++ b/src/profiler.c    2012-10-04 00:10:47 +0000
@@ -204,7 +204,7 @@
 
 /* The profiler timer and whether it was properly initialized, if
    POSIX timers are available.  */
-#ifdef HAVE_TIMER_SETTIME
+#ifdef HAVE_ITIMERSPEC
 static timer_t profiler_timer;
 static bool profiler_timer_ok;
 #endif
@@ -240,7 +240,7 @@
     {
       Lisp_Object oquit;
       EMACS_INT count = 1;
-#ifdef HAVE_TIMER_SETTIME
+#ifdef HAVE_ITIMERSPEC
       if (profiler_timer_ok)
        {
          int overruns = timer_getoverrun (profiler_timer);
@@ -288,7 +288,7 @@
   emacs_sigaction_init (&action, deliver_profiler_signal);
   sigaction (SIGPROF, &action, 0);
 
-#ifdef HAVE_TIMER_SETTIME
+#ifdef HAVE_ITIMERSPEC
   if (! profiler_timer_ok)
     {
       /* System clocks to try, in decreasing order of desirability.  */
@@ -322,14 +322,18 @@
     {
       struct itimerspec ispec;
       ispec.it_value = ispec.it_interval = interval;
-      timer_settime (profiler_timer, 0, &ispec, 0);
-      return TIMER_SETTIME_RUNNING;
+      if (timer_settime (profiler_timer, 0, &ispec, 0) == 0)
+       return TIMER_SETTIME_RUNNING;
     }
 #endif
 
+#ifdef HAVE_SETITIMER
   timer.it_value = timer.it_interval = make_timeval (interval);
-  setitimer (ITIMER_PROF, &timer, 0);
-  return SETITIMER_RUNNING;
+  if (setitimer (ITIMER_PROF, &timer, 0) == 0)
+    return SETITIMER_RUNNING;
+#endif
+
+  return NOT_RUNNING;
 }
 
 DEFUN ("profiler-cpu-start", Fprofiler_cpu_start, Sprofiler_cpu_start,
@@ -367,7 +371,7 @@
     case NOT_RUNNING:
       return Qnil;
 
-#ifdef HAVE_TIMER_SETTIME
+#ifdef HAVE_ITIMERSPEC
     case TIMER_SETTIME_RUNNING:
       {
        struct itimerspec disable;
@@ -377,6 +381,7 @@
       break;
 #endif
 
+#ifdef HAVE_SETITIMER
     case SETITIMER_RUNNING:
       {
        struct itimerval disable;
@@ -384,6 +389,7 @@
        setitimer (ITIMER_PROF, &disable, 0);
       }
       break;
+#endif
     }
 
   signal (SIGPROF, SIG_IGN);

=== modified file 'src/syssignal.h'
--- a/src/syssignal.h   2012-10-01 22:12:44 +0000
+++ b/src/syssignal.h   2012-10-04 00:10:47 +0000
@@ -29,8 +29,12 @@
 #define FORWARD_SIGNAL_TO_MAIN_THREAD
 #endif
 
-#if (defined SIGPROF && (defined HAVE_TIMER_SETTIME || defined HAVE_SETITIMER) 
\
-     && !defined PROFILING)
+#if defined HAVE_TIMER_SETTIME && defined SIGEV_SIGNAL
+# define HAVE_ITIMERSPEC
+#endif
+
+#if (defined SIGPROF && !defined PROFILING \
+     && (defined HAVE_SETITIMER || defined HAVE_ITIMERSPEC))
 # define PROFILER_CPU_SUPPORT
 #endif
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]