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.
This commit is contained in:
parent
a1a9f411ab
commit
2b794d6940
4 changed files with 36 additions and 13 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
2012-10-04 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
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 <eggert@cs.ucla.edu>
|
||||
|
||||
Merge from gnulib, incorporating:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue