int main(int argc, char *argv[]) { void *buf; _xcc_status cc; bool client = false; unsigned short count_read; unsigned short count_written; unsigned short count_xferred; int disable; int ferr; short filenum; int linx; int loop = 1; int maxopen1; int maxopen2; char my_name[BUFSIZ]; int ninx; int oinx; int rd; int recvdepth = 1; int rinx; SB_Tag_Type tag; short tfilenum; int timeout = -1; bool verbose = false; TAD zargs[] = { { "-client", TA_Bool, TA_NOMAX, &client }, { "-loop", TA_Int, TA_NOMAX, &loop }, { "-recvdepth", TA_Int, MAXRCVDEPTH, &recvdepth }, { "-server", TA_Ign, TA_NOMAX, NULL }, { "-v", TA_Bool, TA_NOMAX, &verbose }, { "", TA_End, TA_NOMAX, NULL } }; ferr = file_init(&argc, &argv); TEST_CHK_FEOK(ferr); msfs_util_init_fs(&argc, &argv, file_debug_hook); arg_proc_args(zargs, false, argc, argv); util_test_start(client); ferr = file_mon_process_startup(!client); // system messages? TEST_CHK_FEOK(ferr); util_gethostname(my_name, (int) sizeof(my_name)); if (client) { maxopen1 = (recvdepth + MAXNOWAIT - 1 ) / MAXNOWAIT; maxopen2 = RDOVER / MAXNOWAIT; if (verbose) printf("client maxopen=%d, recvdepth=%d\n", maxopen1, recvdepth); for (oinx = 0; oinx < maxopen1; oinx++) { ferr = XFILE_OPEN_((char *) "$SRV", 8, &filenumc1[oinx], 0, 0, MAXNOWAIT, // nowait 0, 0, 0, 0, NULL); TEST_CHK_FEOK(ferr); } for (oinx = 0; oinx < maxopen2; oinx++) { ferr = XFILE_OPEN_((char *) "$SRV", 8, &filenumc2[oinx], 0, 0, MAXNOWAIT, // nowait 0, 0, 0, 0, NULL); TEST_CHK_FEOK(ferr); } for (linx = 0; linx < loop; linx++) { rd = 0; for (oinx = 0; oinx < maxopen1; oinx++) { for (ninx = 0; ninx < MAXNOWAIT; ninx++) { if (verbose) printf("client wr1, fnum=%d, linx=%d, oinx=%d, ninx=%d, rd=%d\n", filenumc1[oinx], linx, oinx, ninx, rd); sprintf(send_buffer1[oinx][ninx], "hello1, greetings from %s, oinx=%d, ninx=%d, rd=%d", my_name, oinx, ninx, rd); cc = XWRITEREADX(filenumc1[oinx], send_buffer1[oinx][ninx], (short) (strlen(send_buffer1[oinx][ninx]) + 1), BUFSIZ, &count_read, rd); TEST_CHK_CCEQ(cc); rd++; if (rd >= recvdepth) break; } } for (oinx = 0; oinx < maxopen2; oinx++) { for (ninx = 0; ninx < MAXNOWAIT; ninx++) { if (verbose) printf("client wr2, fnum=%d, linx=%d, oinx=%d, ninx=%d, rd=%d\n", filenumc2[oinx], linx, oinx, ninx, rd); sprintf(send_buffer2[oinx][ninx], "hello2, greetings from %s, oinx=%d, ninx=%d, rd=%d", my_name, oinx, ninx, rd); cc = XWRITEREADX(filenumc2[oinx], send_buffer2[oinx][ninx], (short) (strlen(send_buffer2[oinx][ninx]) + 1), BUFSIZ, &count_read, rd); TEST_CHK_CCEQ(cc); rd++; if (rd >= (recvdepth + RDOVER)) break; } } rd = 0; for (oinx = 0; oinx < maxopen1; oinx++) { for (ninx = 0; ninx < MAXNOWAIT; ninx++) { tfilenum = filenumc1[oinx]; if (verbose) printf("client awaitio1, fnum=%d, linx=%d, oinx=%d, ninx=%d, rd=%d\n", tfilenum, linx, oinx, ninx, rd); cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); TEST_CHK_CCEQ(cc); send_buffer1[oinx][ninx][count_xferred] = 0; printf("%s\n", send_buffer1[oinx][ninx]); rd++; if (rd >= recvdepth) break; } } rinx = 0; for (oinx = 0; oinx < maxopen2; oinx++) { for (ninx = 0; ninx < MAXNOWAIT; ninx++) { tfilenum = filenumc2[oinx]; if (verbose) printf("client awaitio2, fnum=%d, linx=%d, oinx=%d, ninx=%d, rd=%d\n", tfilenum, linx, oinx, ninx, rd); disable = msg_test_assert_disable(); cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); msg_test_assert_enable(disable); msg_ok[rinx] = _xstatus_eq(cc); if (msg_ok[rinx]) { send_buffer2[oinx][ninx][count_xferred] = 0; printf("%s\n", send_buffer2[oinx][ninx]); } else if (verbose) printf("client awaitio2-err\n"); rinx++; rd++; if (rd >= (recvdepth + RDOVER)) break; } } // // re-link any failures // rd = recvdepth; rinx = 0; for (oinx = 0; oinx < maxopen2; oinx++) { for (ninx = 0; ninx < MAXNOWAIT; ninx++) { if (msg_ok[rinx++]) continue; tfilenum = filenumc2[oinx]; if (verbose) printf("client wr3, fnum=%d, linx=%d, oinx=%d, ninx=%d, rd=%d\n", filenumc2[oinx], linx, oinx, ninx, rd); sprintf(send_buffer2[oinx][ninx], "hello3, greetings from %s, oinx=%d, ninx=%d, rd=%d", my_name, oinx, ninx, rd); cc = XWRITEREADX(tfilenum, send_buffer2[oinx][ninx], (short) (strlen(send_buffer2[oinx][ninx]) + 1), BUFSIZ, &count_read, rd); TEST_CHK_CCEQ(cc); if (verbose) printf("client awaitio3, fnum=%d, linx=%d, oinx=%d, ninx=%d, rd=%d\n", tfilenum, linx, oinx, ninx, rd); cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); TEST_CHK_CCEQ(cc); send_buffer2[oinx][ninx][count_xferred] = 0; printf("%s\n", send_buffer2[oinx][ninx]); rd++; if (rd >= (recvdepth + RDOVER)) break; } } } } else { ferr = XFILE_OPEN_((char *) "$RECEIVE", 8, &filenum, 0, 0, 0, (short) recvdepth, 1, // no sys msg 0, 0, NULL); TEST_CHK_FEOK(ferr); for (linx = 0; linx < loop; linx++) { for (rinx = 0; rinx < recvdepth; rinx++) { if (verbose) printf("server ru rinx=%d, rd=%d\n", rinx, rinx); cc = XREADUPDATEX(filenum, recv_buffer[rinx], BUFSIZ, &count_read, 0); TEST_CHK_CCEQ(cc); } sleep(1); // force NOLCB for (rinx = 0; rinx < recvdepth; rinx++) { if (verbose) printf("server reply rinx=%d, rd=%d\n", rinx, rinx); strcat(recv_buffer[rinx], "- reply from "); strcat(recv_buffer[rinx], my_name); count_read = (unsigned short) (strlen(recv_buffer[rinx]) + 1); // cast cc = XREPLYX(recv_buffer[rinx], count_read, &count_written, (short) rinx, XZFIL_ERR_OK); TEST_CHK_CCEQ(cc); } sleep(1); // delay rd = recvdepth; for (rinx = 0; rinx < RDOVER; rinx++) { if (verbose) printf("server ru (over) rinx=%d, rd=%d\n", rinx, rd); cc = XREADUPDATEX(filenum, recv_buffer[rinx], BUFSIZ, &count_read, 0); TEST_CHK_CCEQ(cc); if (verbose) printf("server reply (over) rinx=%d, rd=%d\n", rinx, rd); strcat(recv_buffer[rinx], "- reply from "); strcat(recv_buffer[rinx], my_name); count_read = (unsigned short) (strlen(recv_buffer[rinx]) + 1); // cast cc = XREPLYX(recv_buffer[rinx], count_read, &count_written, (short) 0, XZFIL_ERR_OK); TEST_CHK_CCEQ(cc); rd++; } } ferr = XFILE_CLOSE_(filenum, 0); TEST_CHK_FEOK(ferr); } ferr = file_mon_process_shutdown(); TEST_CHK_FEIGNORE(ferr); util_test_finish(client); return 0; }
int main(int argc, char *argv[]) { void *buf; _xcc_status cc; bool client = false; unsigned short count_written; unsigned short count_xferred; int disable; bool done; int ferr; short filenum1; short filenum2; int inx; int loop = 10; char my_name[BUFSIZ]; char my_pname[BUFSIZ]; int out; MS_Mon_Process_Info_Type proc_info; char recv_buffer[BUFSIZ]; char send_buffer[BUFSIZ]; int send_len; SB_Tag_Type tag; int timeout = -1; short tfilenum; TAD zargs[] = { { "-client", TA_Bool, TA_NOMAX, &client }, { "-loop", TA_Int, TA_NOMAX, &loop }, { "-server", TA_Ign, TA_NOMAX, NULL }, { "-v", TA_Bool, TA_NOMAX, &verbose }, { "", TA_End, TA_NOMAX, NULL } }; ferr = file_init(&argc, &argv); TEST_CHK_FEOK(ferr); msfs_util_init_fs(&argc, &argv, file_debug_hook); arg_proc_args(zargs, false, argc, argv); util_test_start(client); ferr = file_mon_process_startup(!client); // system messages? TEST_CHK_FEOK(ferr); util_gethostname(my_name, (int) sizeof(my_name)); ferr = msg_mon_get_my_process_name(my_pname, sizeof(my_pname)); if (client) { ferr = XFILE_OPEN_(srv1, (short) strlen(srv1), &filenum1, 0, 0, MAX_OUT, 0, 0, 0, 0, NULL); TEST_CHK_FEOK(ferr); ferr = msg_mon_get_process_info_detail(srv1, &proc_info); TEST_CHK_FEOK(ferr); ferr = XFILE_OPEN_(srv2, (short) strlen(srv2), &filenum2, 0, 0, MAX_OUT, 0, 0, 0, 0, NULL); TEST_CHK_FEOK(ferr); for (inx = 0; inx < loop; inx++) { sprintf(send_buffer, "hello, greetings from %s, inx=%d", my_name, inx); send_len = (int) strlen(send_buffer) + 1; // cast if (verbose) printf("client doing writereadx's to fn1\n"); for (out = 0; out < MAX_OUT; out++) { cc = XWRITEREADX(filenum1, send_buffer, (ushort) send_len, BUFSIZ, &count_written, 0); TEST_CHK_CCEQ(cc); } if (verbose) printf("client doing writereadx's to fn2\n"); for (out = 0; out < MAX_OUT; out++) { cc = XWRITEREADX(filenum2, send_buffer, (ushort) send_len, BUFSIZ, &count_written, 0); TEST_CHK_CCEQ(cc); } if (verbose) printf("client killing srv1 (pid=%d), closing fn1\n", proc_info.os_pid); kill(proc_info.os_pid, SIGTERM); disable = msg_test_assert_disable(); ferr = XFILE_CLOSE_(filenum1); TEST_CHK_FEIGNORE(ferr); msg_test_assert_enable(disable); if (verbose) printf("client doing awaitios on fn1\n"); for (out = 0; out < MAX_OUT; out++) { tfilenum = -2; disable = msg_test_assert_disable(); cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); msg_test_assert_enable(disable); // can't check cc because of -2 if (_xstatus_eq(cc)) printf("%s\n", send_buffer); } if (verbose) printf("client restarting srv1, reopening fn1\n"); restart_server(argc, argv); ferr = XFILE_OPEN_(srv1, (short) strlen(srv1), &filenum1, 0, 0, MAX_OUT, 0, 0, 0, 0, NULL); TEST_CHK_FEOK(ferr); ferr = msg_mon_get_process_info_detail(srv1, &proc_info); } if (verbose) printf("client sending stop to srv1\n"); strcpy(send_buffer, "stop"); send_len = (int) strlen(send_buffer) + 1; // cast cc = XWRITEREADX(filenum1, send_buffer, (ushort) send_len, BUFSIZ, &count_written, 0); TEST_CHK_CCEQ(cc); tfilenum = filenum1; cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); TEST_CHK_CCEQ(cc); strcpy(send_buffer, "stop"); if (verbose) printf("client sending stop to srv2\n"); cc = XWRITEREADX(filenum2, send_buffer, (ushort) send_len, BUFSIZ, &count_written, 0); TEST_CHK_CCEQ(cc); tfilenum = filenum2; cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); TEST_CHK_CCEQ(cc); if (verbose) printf("client finishing\n"); } else { ferr = XFILE_OPEN_((char *) "$RECEIVE", 8, &filenum1, 0, 0, 0, 1, 1, // no sys msg 0, 0, NULL); TEST_CHK_FEOK(ferr); do { if (verbose) printf("server-%s: doing readupdate\n", my_pname); cc = XREADUPDATEX(filenum1, recv_buffer, BUFSIZ, NULL, 0); if (verbose) printf("server-%s: readupdate done cc=%d\n", my_pname, cc); TEST_CHK_CCEQ(cc); util_time_sleep_ms(10); done = (strcmp(recv_buffer, "stop") == 0); strcat(recv_buffer, "- reply from "); strcat(recv_buffer, my_name); if (verbose) printf("server-%s: doing reply, done=%d\n", my_pname, done); cc = XREPLYX(NULL, 0, &count_written, 0, XZFIL_ERR_OK); TEST_CHK_CCEQ(cc); assert(count_written == 0); } while (!done); ferr = XFILE_CLOSE_(filenum1, 0); TEST_CHK_FEOK(ferr); } ferr = file_mon_process_shutdown(); TEST_CHK_FEOK(ferr); util_test_finish(client); return 0; }