void cleanup_module(void) { char msg[] = "let's end the game"; int i; for (i = 0; i < NTASKS; i++) { end = i; rt_msgsnd_nu(rmbx[i], 1, msg, sizeof(msg), 0); } end = NTASKS; rt_msgsnd_nu(smbx, 1, msg, sizeof(msg), 0); current->state = TASK_INTERRUPTIBLE; schedule_timeout(HZ); for (i = 0; i < NTASKS; i++) { rt_msgctl(rmbx[i], IPC_RMID, NULL); printk("TASK %d, LOOPS: %d.\n", i, cnt[i]); } rt_msgctl(smbx, IPC_RMID, NULL); stop_rt_timer(); rt_sem_delete(&barrier); for (i = 0; i < NTASKS; i++) { rt_task_delete(&mthread[i]); } rt_task_delete(&bthread); rt_printk("MODULE ENDS.\n"); }
int main(void) { RT_TASK *mytask; int smbx, rmbx[NTASKS]; int i, bthread, mthread[NTASKS]; char msg[] = "let's end the game"; mytask = rt_thread_init(nam2num("MAIN"), 2, 0, SCHED_FIFO, 0xF); barrier = rt_sem_init(rt_get_name(0), NTASKS + 1); smbx = rt_msgget(nam2num("SMSG"), 0x666 | IPC_CREAT); for (i = 0; i < NTASKS; i++) { char mname[6] = "RMBX"; mname[4] = i + '0'; mname[5] = 0; rmbx[i] = rt_msgget(nam2num(mname), 0x666 | IPC_CREAT); } rt_set_oneshot_mode(); start_rt_timer(0); bthread = rt_thread_create(bfun, 0, 0x8000); for (i = 0; i < NTASKS; i++) { mthread[i] = rt_thread_create(mfun, (void *)i, 0x8000); } printf("IF NOTHING HAPPENS IS OK, TYPE ENTER TO FINISH.\n"); getchar(); for (i = 0; i < NTASKS; i++) { end = i; rt_msgsnd_nu(rmbx[i], 1, msg, sizeof(msg), 0); rt_thread_join(mthread[i]); } end = NTASKS; rt_msgsnd_nu(smbx, 1, msg, sizeof(msg), 0); rt_thread_join(bthread); for (i = 0; i < NTASKS; i++) { rt_msgctl(rmbx[i], IPC_RMID, NULL); printf("TASK %d, LOOPS: %d.\n", i, cnt[i]); } rt_msgctl(smbx, IPC_RMID, NULL); stop_rt_timer(); rt_sem_delete(barrier); rt_task_delete(mytask); printf("MAIN TASK ENDS.\n"); return 0; }