void user_args::reply (void *res) { //marshall result xdrproc_t inproc = prog->tbl[procno].xdr_res; xdrsuio x (XDR_ENCODE); if ((!inproc) || (!inproc (x.xdrp (), res))) fatal << "couldn't marshall result\n"; int res_len = x.uio ()->resid (); track_reply (*prog, procno, res_len); //stuff into a transport wrapper dorpc_res *rpc_res = New dorpc_res (DORPC_OK); me_->fill_node (rpc_res->resok->src); rpc_res->resok->send_time_echo = send_time; rpc_res->resok->results.setsize (res_len); if (res_len > 0) x.uio ()->copyout (rpc_res->resok->results.base ()); assert (rpc_res->status == DORPC_OK); u_int64_t diff = getusec (true) - init_time; track_proctime (*prog, procno, diff); //reply sbp->reply (rpc_res); delete rpc_res; delete this; }
ptr<dorpc_arg> vnode_impl::marshal_doRPC (ref<location> l, const rpc_program &prog, int procno, ptr<void> in) { //form the transport RPC ptr<dorpc_arg> arg = New refcounted<dorpc_arg> (); //header l->fill_node (arg->dest); me_->fill_node (arg->src); arg->progno = prog.progno; arg->procno = procno; //marshall the args ourself xdrproc_t inproc = prog.tbl[procno].xdr_arg; xdrsuio x (XDR_ENCODE); if ((!inproc) || (!inproc (x.xdrp (), in))) { fatal << "failed to marshall args\n"; return NULL; } else { int args_len = x.uio ()->resid (); arg->args.setsize (args_len); if (args_len > 0) x.uio ()->copyout (arg->args.base ()); } return arg; }
void doRPC (const chord_node &n, int procno, const void *in, void *out, aclnt_coords_cb cb) { ptr<aclnt> c = get_aclnt (n.r.hostname, n.r.port); if (c == NULL) fatal << "doRPC: couldn't aclnt::alloc\n"; //form the transport RPC ptr<dorpc_arg> arg = New refcounted<dorpc_arg> (); //header struct sockaddr_in saddr; bzero(&saddr, sizeof (sockaddr_in)); saddr.sin_family = AF_INET; inet_aton (n.r.hostname.cstr (), &saddr.sin_addr); arg->dest.machine_order_ipv4_addr = ntohl (saddr.sin_addr.s_addr); arg->dest.machine_order_port_vnnum = (n.r.port << 16) | n.vnode_num; //leave coords as random. bzero (&arg->src, sizeof (arg->src)); arg->progno = chord_program_1.progno; arg->procno = procno; //marshall the args ourself xdrproc_t inproc = chord_program_1.tbl[procno].xdr_arg; xdrsuio x (XDR_ENCODE); if ((!inproc) || (!inproc (x.xdrp (), (void *)in))) { fatal << "failed to marshall args\n"; } else { int args_len = x.uio ()->resid (); arg->args.setsize (args_len); void *marshalled_args = suio_flatten (x.uio ()); memcpy (arg->args.base (), marshalled_args, args_len); free (marshalled_args); dorpc_res *res = New dorpc_res (DORPC_OK); c->timedcall (TIMEOUT, TRANSPORTPROC_DORPC, arg, res, wrap (&doRPCcb, n.x, procno, res, out, cb)); } }