Example #1
0
File: asrv.C Project: vonwenm/pbft
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;
    }
}
Example #2
0
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));
  }
}