Spurious timer_create() configure test failure.
On my system, the timer_create() config test fails, but I believe the test program is to blame, not my system.
This is the program in question, as it appears in aclocal.m4:
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
static volatile int tock = 0;
static void handler(int i)
{
tock = 1;
}
static void timeout(int i)
{
// timer_settime() has been known to hang, so just in case
// we install a 1-second timeout (see #2257)
exit(99);
}
int main(int argc, char *argv[])
{
struct sigevent ev;
timer_t timer;
struct itimerspec it;
struct sigaction action;
int m,n,count = 0;
ev.sigev_notify = SIGEV_SIGNAL;
ev.sigev_signo = SIGVTALRM;
action.sa_handler = handler;
action.sa_flags = 0;
sigemptyset(&action.sa_mask);
if (sigaction(SIGVTALRM, &action, NULL) == -1) {
fprintf(stderr,"SIGVTALRM problem\n");
exit(3);
}
action.sa_handler = timeout;
action.sa_flags = 0;
sigemptyset(&action.sa_mask);
if (sigaction(SIGALRM, &action, NULL) == -1) {
fprintf(stderr,"SIGALRM problem\n");
exit(3);
}
alarm(1);
if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
exit(1);
}
it.it_value.tv_sec = 0;
it.it_value.tv_nsec = 1;
it.it_interval = it.it_value;
if (timer_settime(timer, 0, &it, NULL) != 0) {
fprintf(stderr,"settime problem\n");
exit(4);
}
tock = 0;
for(n = 3; n < 20000; n++){
for(m = 2; m <= n/2; m++){
if (!(n%m)) count++;
if (tock) goto out;
}
}
out:
if (!tock) {
fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
exit(5);
}
timer_delete(timer);
if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
fprintf(stderr,"No CLOCK_REALTIME timer\n");
exit(2);
}
it.it_value.tv_sec = 0;
it.it_value.tv_nsec = 1000000;
it.it_interval = it.it_value;
if (timer_settime(timer, 0, &it, NULL) != 0) {
fprintf(stderr,"settime problem\n");
exit(4);
}
tock = 0;
usleep(300);
if (!tock) {
fprintf(stderr,"no CLOCK_REALTIME signal\n");
exit(5);
}
timer_delete(timer);
exit(0);
}
On my system, it outputs "no CLOCK_REALTIME signal".
However, notice that CLOCK_REALTIME-bound timer is set to expire in a million nanoseconds (one millisecond), while usleep is subsequently used to sleep for only 300 microseconds (0.3 milliseconds), which is simply too short. Consequently, tock is not set. If I bump the usleep to 3000 microseconds (3 milliseconds), tock is set and the test succeeds.
I care about the result of this test because if it fails, ghc apparently falls back on using SIGVTALRM instead, which interferes with my application.
Apologies if I've misunderstood the test program.
Trac metadata
Trac field | Value |
---|---|
Version | 6.8.3 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Build System |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Unknown |
Architecture |