#include #include #include #include #include #include #include #include #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 exit(0); } 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; }