#include <time.h>
#include <sys/siginfo.h>
#include <sys/netmgr.h>
#include <sys/neutrino.h>
#include <sys/time.h>
#include <pthread.h>
#include <stdio.h>
#include <signal.h>
#define MY_PULSE_CODE1 1
#define MY_PULSE_CODE2 2
//struktury potrzebne do obliczania czasu od uruchomienia programu
struct timeval startTime, tempTime;
int seconds=0;
long elapsed;
typedef union {
struct _pulse pulse;
} my_message_t;
pthread_mutex_t m;
timer_t timer1_id, timer2_id, timer3_id, timer4_id;
int chid;
int coid2, coid3;
//funkcja wyswietlajaca komunikat wraz z czasem (sekundy:milisekundy)
void say(char* msg)
{
gettimeofday(&tempTime, NULL);
elapsed = ((tempTime.tv_sec-startTime.tv_sec)*1000000 + tempTime.tv_usec-startTime.tv_usec)/1000;
seconds = elapsed/1000;
elapsed = elapsed%1000;
printf("%d:%03ld - %s\n",seconds
,elapsed
, msg
);
}
//watek timera 1.
void* thread1(void* arg)
{
pthread_mutex_lock(&m);
say("T1 - thread triggered");
pthread_mutex_unlock(&m);
}
//funkcja obslugi sygnalu przerwania
void signal_callback_handler(int signum)
{
pthread_mutex_lock(&m);
say("T4 - interrupt signal got");
timer_delete(timer1_id);
timer_delete(timer2_id);
timer_delete(timer3_id);
ConnectDetach(coid2);
ConnectDetach(coid3);
ChannelDestroy(chid);
pthread_mutex_unlock(&m);
//nie zabija watkow wywolanych przez T1, musza wypisac co swoje, dopiero zakancza program
}
int main()
{
struct sigevent event1, event2, event3, event4;
struct itimerspec itime1, itime2, itime3, itime4;
int rcvid;
my_message_t msg;
char *message;
signal(SIGINT, signal_callback_handler);
chid = ChannelCreate(0);
/***************************
* EVENT 1
* ************************/
SIGEV_THREAD_INIT (&event1, (void*)thread1, &timer1_id, NULL);
/**************************
* TIMER 1
* ************************/
itime1.it_value.tv_sec = 0;
/* 500 million nsecs = 0.5s */
itime1.it_value.tv_nsec = 500000000;
itime1.it_interval.tv_sec = 0;
/* 500 million nsecs = 0.5s */
itime1.it_interval.tv_nsec = 500000000;
/***************************
* EVENT 2
* ************************/
coid2 = ConnectAttach(ND_LOCAL_NODE, 0, chid, _NTO_SIDE_CHANNEL, 0);
SIGEV_PULSE_INIT (&event2, coid2, getprio(0), MY_PULSE_CODE1, NULL);
/**************************
* TIMER 2
* ************************/
itime2.it_value.tv_sec = 2;
itime2.it_value.tv_nsec = 0;
itime2.it_interval.tv_sec = 2;
itime2.it_interval.tv_nsec = 0;
/***************************
* EVENT 3
* ************************/
coid3 = ConnectAttach(ND_LOCAL_NODE, 0, chid, _NTO_SIDE_CHANNEL, 0);
SIGEV_PULSE_INIT (&event3, coid3, getprio(0), MY_PULSE_CODE2, NULL);
/**************************
* TIMER 3
* ************************/
itime3.it_value.tv_sec = 5;
itime3.it_value.tv_nsec = 0;
itime3.it_interval.tv_sec = 1;
itime3.it_interval.tv_nsec = 0;
/***************************
* EVENT 4
* ************************/
SIGEV_SIGNAL_INIT (&event4, SIGINT);
/**************************
* TIMER 4
* ************************/
itime4.it_value.tv_sec = 10;
itime4.it_value.tv_nsec = 0;
itime4.it_interval.tv_sec = 0;
itime4.it_interval.tv_nsec = 0;
//tworzymy czasomierze i ustawiamy je majac gotowe struktury z ustawieniami
timer_create(CLOCK_REALTIME, &event1, &timer1_id);
timer_create(CLOCK_REALTIME, &event2, &timer2_id);
timer_create(CLOCK_REALTIME, &event3, &timer3_id);
timer_create(CLOCK_REALTIME, &event4, &timer4_id);
timer_settime(timer1_id, 0, &itime1, NULL);
timer_settime(timer2_id, 0, &itime2, NULL);
timer_settime(timer3_id, 0, &itime3, NULL);
timer_settime(timer4_id, 0, &itime4, NULL);
//czas rozpoczecia
gettimeofday(&startTime, NULL);
while(1)
{
rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
if(rcvid == 0)
{
if(msg.pulse.code == MY_PULSE_CODE1)
{
pthread_mutex_lock(&m);
say("T2");
pthread_mutex_unlock(&m);
}
else if(msg.pulse.code == MY_PULSE_CODE2)
{
pthread_mutex_lock(&m);
say("T3 - third");
pthread_mutex_unlock(&m);
}
}
}
return 0;
}