int tmlib(MS_Mon_Tmlib_Fun_Type fun, MS_Mon_Transid_Type transid, MS_Mon_Transid_Type *transid_out) { const char *funp; MS_Mon_Transid_Type ltransid; if (exp_fun < 0) { printf("client=%d, cb not expected\n", client); assert(false); // callback not expected } else fun_check(fun); switch (fun) { case TMLIB_FUN_REG_TX: funp = "REG"; trans_set_curr(transid); break; case TMLIB_FUN_CLEAR_TX: funp = "CLEAR"; TRANSID_SET_NULL(ltransid); trans_set_curr(ltransid); break; case TMLIB_FUN_REINSTATE_TX: funp = "REINSTATE"; if (client) trans_check(transid); trans_set_curr(transid); break; case TMLIB_FUN_GET_TX: funp = "GET"; break; default: funp = "<unknown>"; TRANSID_SET_NULL(ltransid); trans_set_curr(ltransid); break; } if (print) { char transidbuf[100]; char curr_transidbuf[100]; const char *clientp = client ? "client" : "server"; util_format_transid(transidbuf, transid); util_format_transid(curr_transidbuf, curr_transid); printf("%s tmlib callback, fun=%s(%d), transid=%s, curr-transid=%s\n", clientp, funp, fun, transidbuf, curr_transidbuf); } fun_set(exp_fun_next, -1); if (fun == TMLIB_FUN_GET_TX) *transid_out = curr_transid; return 0; }
// // Purpose: readupdate tag alloc // int FS_util_ru_tag_alloc(FS_Fd_Type *pp_fd, bool pv_read) { FS_Ru_Type *lp_ru; int lv_tag; if (pv_read || (pp_fd->ip_ru_tag_mgr->size() < pp_fd->iv_recv_depth)) { lv_tag = pp_fd->ip_ru_tag_mgr->alloc(); lp_ru = &pp_fd->ip_ru[lv_tag]; lp_ru->iv_inuse = true; lp_ru->ip_buffer = NULL; lp_ru->iv_msgid = -1; lp_ru->iv_read_count = 0; lp_ru->iv_count_written = 0; lp_ru->iv_io_type = -1; lp_ru->iv_read = false; lp_ru->iv_tag = -1; TRANSID_SET_NULL(lp_ru->iv_transid); // link in lp_ru->ip_ru_next = NULL; lp_ru->ip_ru_prev = pp_fd->ip_ru_new; if (pp_fd->ip_ru_new == NULL) pp_fd->ip_ru_old = lp_ru; else pp_fd->ip_ru_new->ip_ru_next = lp_ru; pp_fd->ip_ru_new = lp_ru; } else lv_tag = -1; return lv_tag; }
int main(int argc, char *argv[]) { void *buf; _xcc_status cc; unsigned short count_read; unsigned short count_written; unsigned short count_xferred; int ferr; short filenum; short lasterr; int inx; int loop = 10; char my_name[BUFSIZ]; bool nowait = false; int nid; char *p; int pid; char recv_buffer[BUFSIZ]; char send_buffer[BUFSIZ]; SB_Tag_Type tag; short tfilenum; int tm_seq; int timeout = -1; MS_Mon_Transid_Type transid; TAD zargs[] = { { "-client", TA_Bool, TA_NOMAX, &client }, { "-loop", TA_Int, TA_NOMAX, &loop }, { "-nowait", TA_Bool, TA_NOMAX, &nowait }, { "-print", TA_Bool, TA_NOMAX, &print }, { "-server", TA_Ign, TA_NOMAX, NULL }, { "", TA_End, TA_NOMAX, NULL } }; TRANSID_SET_NULL(curr_transid); TRANSID_SET_NULL(exp_trans); 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, sizeof(my_name)); ferr = msg_mon_trans_register_tmlib(tmlib); TEST_CHK_FEOK(ferr); ferr = msg_mon_get_process_info(NULL, &nid, &pid); TEST_CHK_FEOK(ferr); if (client) { ferr = XFILE_OPEN_((char *) "$srv", 4, &filenum, 0, 0, nowait ? (short) 1 : (short) 0, 0, 0, 0, 0, NULL); TEST_CHK_FEOK(ferr); for (inx = 0; inx < loop; inx++) { ferr = msg_mon_get_tm_seq(&tm_seq); TEST_CHK_FEOK(ferr); if (inx & 1) cc = XSETMODE(filenum, 117, 1, 0, NULL); // suppress else cc = XSETMODE(filenum, 117, 0, 0, NULL); // normal TEST_CHK_CCEQ(cc); ferr = XFILE_GETINFO_(-1, &lasterr, NULL, 0, NULL, NULL, NULL); assert(lasterr == XZFIL_ERR_OK); sprintf(send_buffer, "hello, greetings from %s, inx=%d, trans=%d", my_name, inx, tm_seq); if (print) printf("client enlist, transid=%d\n", tm_seq); TRANSID_SET_SEQ(transid, tm_seq); trans_set_curr(transid); if ((inx & 1) == 0) { ferr = msg_mon_trans_enlist(nid, pid, transid); TEST_CHK_FEOK(ferr); } if ((inx & 1) == 0) fun_set(TMLIB_FUN_GET_TX, TMLIB_FUN_REINSTATE_TX); else fun_set(-1, -1); trans_set(transid); cc = XWRITEREADX(filenum, send_buffer, (short) (strlen(send_buffer) + 1), BUFSIZ, &count_read, 0); if (nowait) { TEST_CHK_CCEQ(cc); tfilenum = filenum; cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); } TEST_CHK_CCEQ(cc); fun_check(-1); if (print) printf("client end, transid=%d\n", tm_seq); if ((inx & 1) == 0) { ferr = msg_mon_trans_end(nid, pid, transid); TEST_CHK_FEOK(ferr); TRANSID_SET_NULL(transid); trans_set_curr(transid); // no more trans } printf("%s\n", send_buffer); } ferr = XFILE_CLOSE_(filenum, 0); TEST_CHK_FEOK(ferr); } else { ferr = XFILE_OPEN_((char *) "$RECEIVE", 8, &filenum, 0, 0, nowait ? (short) 1 : (short) 0, 1, 1, // no sys msg 0, 0, NULL); TEST_CHK_FEOK(ferr); for (inx = 0; inx < loop; inx++) { if ((inx & 1) == 0) fun_set(TMLIB_FUN_REG_TX, -1); else fun_set(-1, -1); cc = XREADUPDATEX(filenum, recv_buffer, BUFSIZ, &count_read, 0); TEST_CHK_CCEQ(cc); if (nowait) { tfilenum = filenum; cc = XAWAITIOX(&tfilenum, &buf, &count_xferred, &tag, timeout, NULL); TEST_CHK_CCEQ(cc); } if (inx & 1) { TRANSID_SET_NULL(transid); } else { p = &recv_buffer[strlen(recv_buffer)]; while ((p > recv_buffer) && (*p != '=')) p--; if (*p == '=') { p++; sscanf(p, "%d", &tm_seq); TRANSID_SET_SEQ(transid, tm_seq); } else TRANSID_SET_NULL(transid); } if (inx & 1) { MS_Mon_Transid_Type ltransid; TRANSID_SET_NULL(ltransid); trans_set_curr(ltransid); } trans_set(transid); trans_check(curr_transid); fun_check(-1); if ((inx & 1) == 0) fun_set(TMLIB_FUN_CLEAR_TX, -1); else fun_set(-1, -1); strcat(recv_buffer, "- reply from "); strcat(recv_buffer, my_name); count_read = (short) (strlen(recv_buffer) + 1); cc = XREPLYX(recv_buffer, count_read, &count_written, 0, XZFIL_ERR_OK); TEST_CHK_FEOK(ferr); fun_check(-1); } ferr = XFILE_CLOSE_(filenum, 0); TEST_CHK_FEOK(ferr); } ferr = file_mon_process_shutdown(); TEST_CHK_FEOK(ferr); util_test_finish(client); return 0; }
int main(int argc, char *argv[]) { int exit; int ferr; bool ldone; int lerr; int msgid; int nid; int oid; int pid; TPT_DECL (phandle); char recv_buffer[BUFSIZ]; short recv_buffer2[BUFSIZ]; RT results; MS_SRE sre; MS_Mon_Transid_Type transid; ferr = msfs_util_init_role(true, &argc, &argv, msg_debug_hook); TEST_CHK_FEOK(ferr); util_test_start(true); ferr = msg_mon_process_startup(true); // system messages TEST_CHK_FEOK(ferr); msg_mon_enable_mon_messages(true); ferr = msg_mon_get_process_info((char *) "$srv", &nid, &pid); TEST_CHK_FEOK(ferr); ferr = msg_mon_open_process((char *) "$srv", // name TPT_REF(phandle), &oid); TEST_CHK_FEOK(ferr); TRANSID_SET_NULL(transid); ferr = msg_mon_deregister_death_notification(nid, pid, transid); TEST_CHK_FEOK(ferr); ferr = msg_mon_register_death_notification(nid, pid); TEST_CHK_FEOK(ferr); ferr = XMSG_LINK_(TPT_REF(phandle), // phandle &msgid, // msgid NULL, // reqctrl 0, // reqctrlsize recv_buffer2, // replyctrl 1, // replyctrlmax NULL, // reqdata 0, // reqdatasize recv_buffer, // replydata BUFSIZ, // replydatamax 0, // linkertag 0, // pri 0, // xmitclass XMSG_LINK_LDONEQ); // linkopts util_check("XMSG_LINK_", ferr); exit = 0; ldone = false; while (!exit) { do { lerr = XWAIT(LREQ|LDONE, -1); TEST_CHK_WAITIGNORE(lerr); if (lerr == LDONE) { ldone = true; break; } lerr = XMSG_LISTEN_((short *) &sre, // sre 0, // listenopts 0); // listenertag } while (lerr == XSRETYPE_NOWORK); if (ldone) { printf("LINK done\n"); lerr = XMSG_LISTEN_((short *) &sre, // sre XLISTEN_ALLOW_LDONEM, // listenopts 0); // listenertag assert(lerr == XSRETYPE_LDONE); ferr = XMSG_BREAK_(sre.sre_msgId, results.u.s, TPT_REF(phandle)); assert(ferr == XZFIL_ERR_OK); break; } ferr = XMSG_READDATA_(sre.sre_msgId, // msgid recv_buffer, // reqdata BUFSIZ); // bytecount util_check("XMSG_READDATA_", ferr); if (sre.sre_flags & XSRE_MON) { MS_Mon_Msg *msg = (MS_Mon_Msg *) recv_buffer; printf("cli: mon message, type=%d\n", msg->type); if (msg->type == MS_MsgType_ProcessDeath) { assert(msg->u.death.nid == nid); assert(msg->u.death.pid == pid); exit = 1; } else if (msg->type == MS_MsgType_Shutdown) { printf("cli: received cluster shutdown, level=%d\n", msg->u.shutdown.level); assert(msg->u.shutdown.level==MS_Mon_ShutdownLevel_Immediate); } } else printf("cli: NON-mon message\n"); XMSG_REPLY_(sre.sre_msgId, // msgid NULL, // replyctrl 0, // replyctrlsize NULL, // replydata 0, // replydatasize 0, // errorclass NULL); // newphandle } ferr = msg_mon_process_shutdown(); TEST_CHK_FEOK(ferr); util_test_finish(true); return 0; }