void *thread_send(void *arg) { int ferr; int inx; Item item; int msgid; Util_AA<char> send_buffer(40000); arg = arg; // touch for (inx = 0; inx < loop; inx++) { sprintf(&send_buffer, "hello, greetings from %s, inx=%d", my_name, inx); ferr = XMSG_LINK_(TPT_REF(phandle), // phandle &msgid, // msgid NULL, // reqctrl 0, // reqctrlsize NULL, // replyctrl 0, // replyctrlmax &send_buffer, // reqdata 39000, // reqdatasize recv_buffer, // replydata 40000, // replydatamax 0, // linkertag 0, // pri 0, // xmitclass XMSG_LINK_LDONEQ); // linkopts util_check("XMSG_LINK_", ferr); item.iv_link.iv_id.i = msgid; queue1.add(&item.iv_link); queue2.remove(); } return NULL; }
void *thread_sendbrk(void *arg) { int ferr; int inx; int msgid; RT results; arg = arg; // touch for (inx = 0; inx < loop; inx++) { Item *item = (Item *) queue1.remove(); msgid = item->iv_link.iv_id.i; ferr = XMSG_BREAK_(msgid, results.u.s, TPT_REF(phandle)); util_check("XMSG_BREAK_", ferr); assert(results.u.t.ctrl_size == 0); assert(results.u.t.errm == RT_DATA_RCVD); // data printf("%s\n", recv_buffer); queue2.add(&item->iv_link); } return NULL; }
void *server_thr(void *arg) { int lerr; int max_msgs = maxcp * maxc * loop; Test_SRE sre; Test_SRE *srep; int status; int whoami = inxs++; arg = arg; // touch for (;;) { if (thrlisten) { sre.fin = false; if (sre_count >= max_msgs) break; do { lerr = XWAIT(LREQ, -1); lerr = XMSG_LISTEN_((short *) &sre.sre, // sre 0, // listenopts 0); // listenertag } while (lerr == XSRETYPE_NOWORK); status = mutex.lock(); TEST_CHK_STATUSOK(status); sre_count++; status = mutex.unlock(); TEST_CHK_STATUSOK(status); srep = &sre; } else srep = (Test_SRE *) work_q.remove(); if (verbose) printf("s-%d: have work, fin=%d\n", whoami, srep->fin); if (srep->fin) break; server(whoami, srep); if (!thrlisten) free_q.add(&srep->link); } return NULL; }
int main(int argc, char *argv[]) { bool abortclose = false; bool client = false; int ferr; int inx; int lerr; int oid; int proc; void *res; int status; int thr; TAD zargs[] = { { "-abortclose", TA_Bool, TA_NOMAX, &abortclose }, { "-abortserver", TA_Bool, TA_NOMAX, &abortserver }, { "-client", TA_Bool, TA_NOMAX, &client }, { "-debug", TA_Bool, TA_NOMAX, &debug }, { "-event", TA_Bool, TA_NOMAX, &event }, { "-inst", TA_Int, TA_NOMAX, &inst }, { "-loop", TA_Int, TA_NOMAX, &loop }, { "-maxc", TA_Int, MAX_THR_C, &maxc }, { "-maxcp", TA_Int, TA_NOMAX, &maxcp }, { "-maxs", TA_Int, MAX_THR_S, &maxs }, { "-maxsp", TA_Int, TA_NOMAX, &maxsp }, { "-mq", TA_Bool, TA_NOMAX, &mq }, { "-name", TA_Str, TA_NOMAX, &name }, { "-noshutdown", TA_Bool, TA_NOMAX, &shutdown }, { "-quiet", TA_Bool, TA_NOMAX, &quiet }, { "-server", TA_Ign, TA_NOMAX, NULL }, { "-thrlisten", TA_Bool, TA_NOMAX, &thrlisten }, { "-txrate", TA_Bool, TA_NOMAX, &txrate }, { "-v", TA_Bool, TA_NOMAX, &verbose }, { "", TA_End, TA_NOMAX, NULL } }; msfs_util_init(&argc, &argv, msg_debug_hook); arg_proc_args(zargs, false, argc, argv); // setup threads if (client) { for (inx = 0; inx < maxc; inx++) { char lname[10]; sprintf(lname, "c%d", inx); thrc[inx] = new SB_Thread::Thread(client_thr, lname); } } else { for (inx = 0; inx < maxs; inx++) { char lname[10]; sprintf(lname, "s%d", inx); thrs[inx] = new SB_Thread::Thread(server_thr, lname); } } util_test_start(client); ferr = msg_mon_process_startup(!client); // system messages TEST_CHK_FEOK(ferr); if (client) { printf("inst=%d, loop=%d, maxc=%d, maxcp=%d, maxs=%d, maxsp=%d, shutdown=%d, thrlisten=%d, txrate=%d\n", inst, loop, maxc, maxcp, maxs, maxsp, shutdown, thrlisten, txrate); ferr = msg_mon_open_process((char *) "$srv", // name TPT_REF(phandle), &oid); TEST_CHK_FEOK(ferr); } util_gethostname(my_name, sizeof(my_name)); if (client) { for (inx = 0; inx < maxc; inx++) thrc[inx]->start(); for (inx = 0; inx < maxc; inx++) { status = thrc[inx]->join(&res); TEST_CHK_STATUSOK(status); printf("joined with client %d\n", inx); } } else { for (inx = 0; inx < MAX_SRES; inx++) free_q.add(&sres[inx].link); for (inx = 0; inx < maxs; inx++) thrs[inx]->start(); if (!thrlisten) { Test_SRE *sre = NULL; for (proc = 0; proc < maxcp; proc++) { for (thr = 0; thr < maxc; thr++) { for (inx = 0; inx < loop;) { lerr = XWAIT(LREQ, -1); TEST_CHK_WAITIGNORE(lerr); do { if (sre == NULL) { sre = (Test_SRE *) free_q.remove(); assert(sre != NULL); } sre->fin = false; lerr = XMSG_LISTEN_((short *) &sre->sre, // sre 0, // listenopts 0); // listenertag if (lerr == XSRETYPE_IREQ) { assert(sre->sre.sre_msgId > 0); if (verbose) printf("s-main: queue work inx=%d\n", inx); work_q.add(&sre->link); sre = NULL; inx++; } } while (lerr == XSRETYPE_IREQ); } } } for (inx = 0; inx < maxs; inx++) { Test_SRE *quit_sre = (Test_SRE *) free_q.remove(); quit_sre->fin = true; if (verbose) printf("s-main: fin inx=%d\n", inx); work_q.add(&quit_sre->link); util_time_sleep_ms(1); } } for (inx = 0; inx < maxs; inx++) { status = thrs[inx]->join(&res); TEST_CHK_STATUSOK(status); printf("joined with server %d\n", inx); } } if (abortclose) util_abort_core_free(); if (client) { ferr = msg_mon_close_process(TPT_REF(phandle)); TEST_CHK_FEOK(ferr); } if (shutdown) { ferr = msg_mon_process_shutdown(); TEST_CHK_FEOK(ferr); } util_test_finish(client); return 0; }