Beispiel #1
0
static void
clnt_dg_destroy(CLIENT *clnt)
{
	struct cx_data *cx = (struct cx_data *)clnt->cl_p1;
	struct rpc_dplx_rec *rec = (struct rpc_dplx_rec *)clnt->cl_p2;
	int cu_fd = CU_DATA(cx)->cu_fd;
	sigset_t mask, newmask;

	/* Handle our own signal mask here, the signal section is
	 * larger than the wait (not 100% clear why) */
	sigfillset(&newmask);
	thr_sigsetmask(SIG_SETMASK, &newmask, &mask);

	/* barrier both channels */
	rpc_dplx_swc(clnt, rpc_flag_clear);
	rpc_dplx_rwc(clnt, rpc_flag_clear);

	if (CU_DATA(cx)->cu_closeit)
		(void)close(cu_fd);
	XDR_DESTROY(&(CU_DATA(cx)->cu_outxdrs));

	/* signal both channels */
	rpc_dplx_ssc(clnt, RPC_DPLX_FLAG_NONE);
	rpc_dplx_rsc(clnt, RPC_DPLX_FLAG_NONE);

	/* release */
	rpc_dplx_unref(rec, RPC_DPLX_FLAG_NONE);
	free_cx_data(cx);

	if (clnt->cl_netid && clnt->cl_netid[0])
		mem_free(clnt->cl_netid, strlen(clnt->cl_netid) + 1);
	if (clnt->cl_tp && clnt->cl_tp[0])
		mem_free(clnt->cl_tp, strlen(clnt->cl_tp) + 1);
	mem_free(clnt, sizeof(CLIENT));
	thr_sigsetmask(SIG_SETMASK, &mask, NULL);
}
Beispiel #2
0
void vc_shared_destroy(struct x_vc_data *xd)
{
    struct rpc_dplx_rec *rec = xd->rec;
    struct ct_data *ct = &xd->cx.data;
    SVCXPRT *xprt;
    bool closed = FALSE;
    bool xdrs_destroyed = FALSE;

    /* RECLOCKED */

    if (ct->ct_closeit && ct->ct_fd != RPC_ANYFD) {
        (void)close(ct->ct_fd);
        closed = TRUE;
    }

    /* destroy shared XDR record streams (once) */
    XDR_DESTROY(&xd->shared.xdrs_in);
    XDR_DESTROY(&xd->shared.xdrs_out);
    xdrs_destroyed = TRUE;

    if (ct->ct_addr.buf)
        mem_free(ct->ct_addr.buf, 0); /* XXX */

    /* svc_vc */
    xprt = rec->hdl.xprt;
    if (xprt) {

        XPRT_TRACE_RADDR(xprt, __func__, __func__, __LINE__);

        rec->hdl.xprt = NULL; /* unreachable */

        if (! closed) {
            if (xprt->xp_fd != RPC_ANYFD)
                (void)close(xprt->xp_fd);
        }

        /* request socket */
        if (! xdrs_destroyed) {
            XDR_DESTROY(&(xd->shared.xdrs_in));
            XDR_DESTROY(&(xd->shared.xdrs_out));
        }

        if (xprt->xp_rtaddr.buf)
            mem_free(xprt->xp_rtaddr.buf, xprt->xp_rtaddr.maxlen);
        if (xprt->xp_ltaddr.buf)
            mem_free(xprt->xp_ltaddr.buf, xprt->xp_ltaddr.maxlen);
        if (xprt->xp_tp)
            mem_free(xprt->xp_tp, 0);
        if (xprt->xp_netid)
            mem_free(xprt->xp_netid, 0);

        /* call free hook */
        if (xprt->xp_ops2->xp_free_xprt)
            xprt->xp_ops2->xp_free_xprt(xprt);

        mem_free(xprt, sizeof(SVCXPRT));
    }

    rec->hdl.xd = NULL;

    /* unref shared */
    REC_UNLOCK(rec);

    if (xprt)
        rpc_dplx_unref(rec, RPC_DPLX_FLAG_NONE);

    /* free xd itself */
    mem_free(xd, sizeof(struct x_vc_data));
}