From 80bd319a6dfbc6d5f740dd53e0658cde97143a8f Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Wed, 27 Jan 2021 16:00:05 +0100 Subject: [PATCH] Ooops. --- timer.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/timer.c b/timer.c index 1945e4c..d7bf380 100644 --- a/timer.c +++ b/timer.c @@ -1,11 +1,68 @@ #include #include -#include +#include +#include +#include +#include #include "lceb.h" +int sigint_received=0; int displaytimer=0; static struct timespec start; +static void stopall(signum) + int signum; +{ + printf("SIGNAL %d RECEIVED: aborting eval\n", signum); + sigint_received=1; +} + +int stopped() +{ + return sigint_received; +} + +void set_intr() +{ + struct sigaction sig; + + sig.sa_handler = stopall; + sigemptyset(&sig.sa_mask); + sig.sa_flags = 0; + sigaction(SIGINT, &sig, NULL); + //sigaction(SIGUSR1, &sig, NULL); +# ifdef DEBUG + printf("SIGINT armed.\n"); +# endif +} + +void set_alarm(ms) + int ms; +{ + struct sigaction sig; + struct itimerval timer; + + /* Install timer_handler as the signal handler for SIGVTALRM. */ + //memset (&sa, 0, sizeof (sa)); + sig.sa_handler = stopall; + sigemptyset(&sig.sa_mask); + sig.sa_flags = 0; + sigaction (SIGALRM, &sig, NULL); + + timer.it_value.tv_sec = ms/1000; + timer.it_value.tv_usec = (ms%1000)*1000; +# ifdef DEBUG + printf("alarm clock set to %.2f secs.\n", + timer.it_value.tv_sec + timer.it_value.tv_usec / 1000000.); +# endif + /* ... and every 250 msec after that. */ + timer.it_interval.tv_sec = 0; + timer.it_interval.tv_usec = 0; + /* Start a virtual timer. It counts down whenever this process is executing. */ + setitimer (ITIMER_REAL, &timer, NULL); + +} + void start_timer() { printf("timer started...\n"); @@ -29,7 +86,6 @@ double get_timer(timer) struct timespec timer; { double diff; - diff=(timer.tv_sec - start.tv_sec) + (timer.tv_nsec - start.tv_nsec) / NANOSEC; # ifdef DEBUG_TIMER printf("timer sec: %.5f\n", diff); @@ -43,18 +99,20 @@ int main(ac, av) char **av; { int delay; - struct timespec end, tsdelay; + struct timespec end; if (ac != 2) { fprintf(stderr, "usage: %s msecs\n", *av); exit (1); } - delay=atoi(*(av+1)); + delay=atoi(*(av+1))*10; start_timer(); - tsdelay.tv_sec=delay/MILLISEC; - tsdelay.tv_nsec=delay%MILLISEC; - printf("delay %d=%ld:%ld\n", delay, tsdelay.tv_sec, tsdelay.tv_nsec); - nanosleep(&tsdelay, NULL); + set_intr(); + set_alarm(delay); + //tsdelay.tv_sec=delay/MILLISEC; + //tsdelay.tv_nsec=delay%MILLISEC; + //printf("delay %d=%ld:%ld\n", delay, tsdelay.tv_sec, tsdelay.tv_nsec); + sleep(5); set_timer(&end); printf("Time elapsed: %.5f seconds\n", get_timer(end));