static void svc_dg_destroy_task(struct work_pool_entry *wpe) { struct rpc_dplx_rec *rec = opr_containerof(wpe, struct rpc_dplx_rec, ioq.ioq_wpe); uint16_t xp_flags; __warnx(TIRPC_DEBUG_FLAG_REFCNT, "%s() %p fd %d xp_refs %" PRIu32, __func__, rec, rec->xprt.xp_fd, rec->xprt.xp_refs); if (rec->xprt.xp_refs) { /* instead of nanosleep */ work_pool_submit(&svc_work_pool, &(rec->ioq.ioq_wpe)); return; } xp_flags = atomic_postclear_uint16_t_bits(&rec->xprt.xp_flags, SVC_XPRT_FLAG_CLOSE); if ((xp_flags & SVC_XPRT_FLAG_CLOSE) && rec->xprt.xp_fd != RPC_ANYFD) { (void)close(rec->xprt.xp_fd); rec->xprt.xp_fd = RPC_ANYFD; } if (rec->xprt.xp_ops->xp_free_user_data) rec->xprt.xp_ops->xp_free_user_data(&rec->xprt); if (rec->xprt.xp_tp) mem_free(rec->xprt.xp_tp, 0); if (rec->xprt.xp_netid) mem_free(rec->xprt.xp_netid, 0); if (rec->xprt.xp_parent) SVC_RELEASE(rec->xprt.xp_parent, SVC_RELEASE_FLAG_NONE); svc_dg_xprt_free(DG_DR(rec)); }
uint16_t x2__atomic_postclear_uint16_t_bits(uint16_t *p, uint16_t v) { return atomic_postclear_uint16_t_bits(p, v); }