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); }
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)); }