void asrv_replay::sendreply (svccb *sbp, xdrsuio *x, bool nocache) { if (!x) { rtab.remove (sbp); delete sbp; return; } if (sbp->arg) { xdr_delete (tbl[sbp->proc ()].xdr_arg, sbp->arg); sbp->arg = NULL; } sbp->reslen = x->uio ()->resid (); sbp->res = suio_flatten (x->uio ()); x->uio ()->clear (); if (!xi->ateof ()) xi->xh->send (sbp->res, sbp->reslen, sbp->addr); if (sbp->resdat) { xdr_delete (tbl[sbp->proc ()].xdr_res, sbp->resdat); sbp->resdat = NULL; } if (nocache) { rtab.remove (sbp); delete sbp; return; } }
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)); } }