#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>

#define PERIOD_SEC 1
#define PERIOD_NSEC 0

#define TIME_CST 330000
#define PROC 2 //Vitesse du processeur

int cpt = 0;

void do_work(unsigned int duration) /* duration en millisecondes */
{
    int i;

    for(i=0;i<TIME_CST *duration;i++) asm volatile ("nop");
}

void handler()
{
    switch((cpt++)%5)
    {
        case 2:
            t2();
        break;

        case 3:
            t3();
        break;

        case 4:
            t4();
        break;

        default:

        break;
    }
}

void t2()
{
    printf("t2\n");
    do_work(333/PROC);
}

void t3()
{
    printf("t3\n");
    do_work(1000/PROC);
}

void t4()
{
    printf("t4\n");
    do_work(2000/PROC);
}

int main()
{
    timer_t timer_id;
    struct itimerspec info_timer;

    signal(SIGALRM, handler);

    timer_create(CLOCK_REALTIME, NULL, &timer_id);

    info_timer.it_value.tv_sec = PERIOD_SEC;
    info_timer.it_value.tv_nsec = PERIOD_NSEC;

    info_timer.it_interval.tv_sec = PERIOD_SEC;
    info_timer.it_interval.tv_nsec = PERIOD_NSEC;

    timer_settime(timer_id, 0, &info_timer, NULL);

    while(1) alarm(1);

    pause();
    return 0;
}
