diff --git a/ChangeLog b/ChangeLog index 411ef633420..019913e27d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-10-04 Paul Eggert + + 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 Merge from gnulib, incorporating: diff --git a/src/atimer.c b/src/atimer.c index 048c62798ef..5752192be76 100644 --- a/src/atimer.c +++ b/src/atimer.c @@ -42,7 +42,7 @@ static struct atimer *atimers; /* 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 @@ set_alarm (void) #endif EMACS_TIME now, interval; -#ifdef HAVE_TIMER_SETTIME +#ifdef HAVE_ITIMERSPEC if (alarm_timer_ok) { struct itimerspec ispec; @@ -416,7 +416,7 @@ void 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; diff --git a/src/profiler.c b/src/profiler.c index 7b4ffc7f7bf..461aae3e09f 100644 --- a/src/profiler.c +++ b/src/profiler.c @@ -204,7 +204,7 @@ record_backtrace (log_t *log, EMACS_INT count) /* 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 @@ handle_profiler_signal (int signal) { 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 @@ setup_cpu_timer (Lisp_Object sampling_interval) 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 @@ setup_cpu_timer (Lisp_Object sampling_interval) { 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 @@ Return non-nil if the profiler was running. */) case NOT_RUNNING: return Qnil; -#ifdef HAVE_TIMER_SETTIME +#ifdef HAVE_ITIMERSPEC case TIMER_SETTIME_RUNNING: { struct itimerspec disable; @@ -377,6 +381,7 @@ Return non-nil if the profiler was running. */) break; #endif +#ifdef HAVE_SETITIMER case SETITIMER_RUNNING: { struct itimerval disable; @@ -384,6 +389,7 @@ Return non-nil if the profiler was running. */) setitimer (ITIMER_PROF, &disable, 0); } break; +#endif } signal (SIGPROF, SIG_IGN); diff --git a/src/syssignal.h b/src/syssignal.h index 66538aad100..83ab19698dd 100644 --- a/src/syssignal.h +++ b/src/syssignal.h @@ -29,8 +29,12 @@ extern void init_signals (bool); #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