Opened 6 years ago

Closed 6 years ago

Last modified 6 years ago

#2434 closed bug (fixed)

Spurious timer_create() configure test failure.

Reported by: Eelis- Owned by: simonmar
Priority: normal Milestone:
Component: Build System Version: 6.8.3
Keywords: timer_create configure Cc:
Operating System: Unknown/Multiple Architecture: x86_64 (amd64)
Type of failure: Difficulty: Unknown
Test Case: Blocked By:
Blocking: Related Tickets:

Description

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.

Change History (3)

comment:1 Changed 6 years ago by simonmar

  • Difficulty set to Unknown
  • Owner set to simonmar

looks like you're right - strangely the test works on my systems here. I'll fix it.

comment:2 Changed 6 years ago by simonmar

  • Resolution set to fixed
  • Status changed from new to closed

Fixed, thanks:

Mon Jul 14 04:10:07 PDT 2008  Simon Marlow <marlowsd@gmail.com>
  * fix #2434: we weren't waiting long enough for the signal

comment:3 Changed 6 years ago by simonmar

  • Operating System changed from Unknown to Unknown/Multiple
Note: See TracTickets for help on using tickets.