int main(int argc, char *argv[]) { unsigned long sndnode; long sndport, i, r; RT_TASK *rcvtsk, *sndtsk; struct sockaddr_in addr; static MBX *sndmbx; SERVER = atoi(argv[1]); if (!(rcvtsk = rt_task_init_schmod(nam2num("RCVTSK"), 2, 0, 0, SCHED_FIFO, 0xF))) { printf("CANNOT INIT RECEIVER TASK\n"); exit(1); } mbx = rt_mbx_init(nam2num("MBX"), 100); athread = rt_thread_create(async_fun, NULL, 10000); sndnode = 0; if (argc == 3 && strstr(argv[2], "SndNode=")) { inet_aton(argv[2] + 8, &addr.sin_addr); sndnode = addr.sin_addr.s_addr; } if (!sndnode) { inet_aton("127.0.0.1", &addr.sin_addr); sndnode = addr.sin_addr.s_addr; } rt_set_oneshot_mode(); start_rt_timer(0); while ((sndport = rt_request_port_mbx(sndnode, mbx)) <= 0 && sndport != -EINVAL); while (!(sndmbx = RT_get_adr(sndnode, sndport, "SNDMBX"))) { rt_sleep(nano2count(100000000)); } sndtsk = RT_get_adr(sndnode, sndport, "SNDTSK"); printf("\nRECEIVER TASK RUNNING\n"); mlockall(MCL_CURRENT | MCL_FUTURE); rt_make_hard_real_time(); while (!end) { r = RT_mbx_receive(sndnode, -sndport, sndmbx, &i, sizeof(long)); rt_printk("RECEIVE %ld %ld\n", r, i); if (SERVER) { rt_sleep(nano2count(100000000)); } else { while (!end && rt_waiting_return(sndnode, sndport)) { rt_sleep(nano2count(1000000)); } if (!end) { unsigned long long retval; long i1, i2; int l1, l2; if (rt_sync_net_rpc(sndnode, -sndport)) { l1 = l2 = sizeof(long); rt_get_net_rpc_ret(mbx, &retval, &i1, &l1, &i2, &l2, 0LL, MBX_RECEIVE); rt_printk("RECEIVER ASYNC MSG: RETVAL = %d, MSG = %ld, LEN = %d.\n", (int)retval, i1, l1); if (i1 < 0) { end = 1; break; } } } } } rt_mbx_delete(mbx); rt_release_port(sndnode, sndport); rt_make_soft_real_time(); rt_thread_join(athread); rt_return(rt_receive(0, &i), i); rt_task_delete(rcvtsk); stop_rt_timer(); printf("\nRECEIVER TASK STOPS\n"); return 0; }
static void *start_task_code(void *args) { int i, srvport; char buf[9]; RT_TASK *task; buf[8] = 0; if (!(task = rt_thread_init(getpid(), 10, 0, SCHED_FIFO, 0xF))) { printf("CANNOT INIT START_TASK BUDDY\n"); exit(1); } srvport = rt_request_hard_port(comnode); printf("START TASK GOT ITS EXEC COMNODE PORT %lx, %d\n", comnode, srvport); mlockall(MCL_CURRENT | MCL_FUTURE); rt_make_hard_real_time(); RT_SEM_SIGNAL(comnode, -srvport, sems[0]); for (i = 0; i < NUM_TASKS; ++i) { RT_sem_wait(comnode, srvport, sync_sem); } TAKE_PRINT; rt_printk(sync_str); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { RT_SEM_SIGNAL(comnode, -srvport, prio_sem); } TAKE_PRINT; rt_printk("\n"); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { RT_sem_wait(comnode, srvport, sync_sem); } TAKE_PRINT; rt_printk(sync_str); GIVE_PRINT; TAKE_PRINT; rt_printk("testing message queues\n"); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { if (RT_mbx_send(comnode, srvport, mbx_in, strs[i], 8)) { TAKE_PRINT; rt_printk("RT_mbx_send() failed\n"); GIVE_PRINT; } } for (i = 0; i < NUM_TASKS; ++i) { RT_mbx_receive(comnode, srvport, mbx_out, buf, 8); TAKE_PRINT; rt_printk("\nreceived from mbx_out: %s", buf); GIVE_PRINT; } TAKE_PRINT; rt_printk("\n"); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { RT_SEM_SIGNAL(comnode, -srvport, sync_sem); } TAKE_PRINT; rt_printk("\ninit task complete\n"); GIVE_PRINT; printf("START TASK REL ITS EXEC COMNODE PORT %lx, %d\n", comnode, srvport); RT_sem_signal(comnode, srvport, end_sem); rt_make_soft_real_time(); rt_release_port(comnode, srvport); rt_task_delete(task); return (void *)0; }
static void start_task_code(long none) { int i, srvport; char buf[9]; while ((srvport = rt_request_port(tasknode)) <= 0); rt_printk("START TASK GOT SYNC TASKNODE PORT %lx, %d\n", tasknode, srvport); while (!RT_get_adr(tasknode, srvport, task[NUM_TASKS - 1])); rt_printk("START TASK REL SYNC TASKNODE PORT %lx, %d\n", tasknode, srvport); rt_release_port(tasknode, srvport); srvport = rt_request_port(comnode); rt_printk("START TASK GOT ITS INIT AND EXEC COMNODE PORT %lx, %d\n", comnode, srvport); print_sem = RT_get_adr(comnode, srvport, "PRTSEM"); sync_sem = RT_get_adr(comnode, srvport, "SYNCSM"); prio_sem = RT_get_adr(comnode, srvport, "PRIOSM"); mbx_in = RT_get_adr(comnode, srvport, "MBXIN"); mbx_out = RT_get_adr(comnode, srvport, "MBXOUT"); for (i = 0; i < NUM_TASKS; ++i) { sems[i] = RT_get_adr(comnode, srvport, sem[i]); } buf[8] = 0; RT_sem_signal(comnode, srvport, sems[0]); for (i = 0; i < NUM_TASKS; ++i) { RT_sem_wait(comnode, srvport, sync_sem); } TAKE_PRINT; rt_printk(sync_str); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { RT_sem_signal(comnode, srvport, prio_sem); } TAKE_PRINT; rt_printk("\n"); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { RT_sem_wait(comnode, srvport, sync_sem); } TAKE_PRINT; rt_printk(sync_str); GIVE_PRINT; TAKE_PRINT; rt_printk("testing message queues\n"); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { if (RT_mbx_send(comnode, srvport, mbx_in, strs[i], 8)) { TAKE_PRINT; rt_printk("RT_mbx_send() failed\n"); GIVE_PRINT; } } for (i = 0; i < NUM_TASKS; ++i) { RT_mbx_receive(comnode, srvport, mbx_out, buf, 8); TAKE_PRINT; rt_printk("\nreceived from mbx_out: %s", buf); GIVE_PRINT; } TAKE_PRINT; rt_printk("\n"); GIVE_PRINT; for (i = 0; i < NUM_TASKS; ++i) { RT_sem_signal(comnode, srvport, sync_sem); } TAKE_PRINT; rt_printk("\ninit task complete\n"); GIVE_PRINT; rt_release_port(comnode, srvport); rt_printk("START TASK REL ITS EXEC COMNODE PORT %lx, %d\n", comnode, srvport); atomic_inc(&cleanup); }
static void *task_code(void *arg) { RT_TASK *mytask; int task_no, i, ret, srvport; char buf[9]; task_no = *((int *)arg); buf[8] = 0; if (!(mytask = rt_thread_init(nam2num(task[task_no]), NUM_TASKS - task_no, 0, SCHED_FIFO, 0xF))) { printf("CANNOT INIT TASK TASK %d\n", task_no); exit(1); } srvport = rt_request_port(comnode); printf("TASK_NO %d GOT ITS EXEC COMNODE PORT %lx, %d\n", task_no, comnode, srvport); mlockall(MCL_CURRENT | MCL_FUTURE); rt_make_hard_real_time(); for (i = 0; i < 5; ++i) { RT_sem_wait(comnode, srvport, sems[task_no]); TAKE_PRINT; rt_printk(strs[task_no]); GIVE_PRINT; if (task_no == NUM_TASKS - 1) { TAKE_PRINT; rt_printk("\n"); GIVE_PRINT; } RT_SEM_SIGNAL(comnode, -srvport, sems[(task_no + 1)%NUM_TASKS]); } RT_SEM_SIGNAL(comnode, -srvport, sync_sem); RT_sem_wait(comnode, srvport, prio_sem); TAKE_PRINT; rt_printk(strs[task_no]); GIVE_PRINT; RT_sleep(comnode, srvport, 1000000000LL); RT_sem_wait_timed(comnode, srvport, prio_sem, (task_no + 1)*1000000000LL); TAKE_PRINT; rt_printk("sem timeout, task %d, %s\n", task_no, strs[task_no]); GIVE_PRINT; RT_SEM_SIGNAL(comnode, -srvport, sync_sem); /* message queue stuff */ if ((ret = RT_mbx_receive(comnode, srvport, mbx_in, buf, 8)) != 0) { TAKE_PRINT; rt_printk("RT_mbx_receive() failed with %d\n", ret); GIVE_PRINT; } TAKE_PRINT; rt_printk("\nreceived by task %d ", task_no); rt_printk(buf); GIVE_PRINT; RT_mbx_send(comnode, srvport, mbx_out, strs[task_no], 8); /* test receive timeout */ RT_sem_wait(comnode, srvport, sync_sem); if (RT_mbx_receive_timed(comnode, srvport, mbx_in, buf, 8, (task_no + 1)*1000000000LL)) { TAKE_PRINT; rt_printk("mbx timeout, task %d, %s\n", task_no, strs[task_no]); GIVE_PRINT; } TAKE_PRINT; rt_printk("\ntask %d complete\n", task_no); GIVE_PRINT; rt_make_soft_real_time(); printf("TASK_NO %d REL ITS EXEC COMNODE PORT %lx, %d\n", task_no, comnode, srvport); RT_sem_signal(comnode, srvport, end_sem); rt_release_port(comnode, srvport); rt_task_delete(mytask); return (void *)0; }